繁体   English   中英

使用实体框架添加具有新导航属性的新实体

[英]Adding New Entity with New Navigation Property Using Entity Framework

我有一个类模型,可以将特征图像添加到ProductType实体。 单独的ProductType类定义标识了引用特定图像的HomePageImageId和HomePageImage导航属性。

我有一个Image类定义,其中包含图像的所有META信息(即宽度,高度,格式类型,名称等)。

我也有一个ImageData类定义,其中包含实际的图像数据。 这与通过上述Image类可用的元信息具有FK关系。

这就是EF实体的外观。

[DataContract]
[Table("ProductTypes")]
public class ProductType : IEntity
{
    [Key]
    [DataMember]
    [Column("Id")]
    public Int64 Id { get; set; }

    [DataMember]
    [DataType(DataType.Text)]
    [Column("Name")]
    public String Name { get; set; }

    [DataMember]
    [DataType(DataType.MultilineText)]
    [Column("Description")]
    public String Description { get; set; }

    [DataMember]
    [DataType(DataType.MultilineText)]
    [Column("Excerpt")]
    public String Excerpt { get; set; }

    [DataMember]
    [Column("ImageId")]
    public Int64? ImageId { get; set; }

    [ForeignKey("ImageId")]
    public virtual Image HomePageImage { get; set; }

}


[DataContract]
[Table("Images")]
public class Image : IEntity
{
    [Key]
    [DataMember]
    [Column("Id")]
    public Int64 Id { get; set; }

    [DataMember]
    [Column("Name")]
    [DataType(DataType.Text)]
    public String Name { get; set; }

    // Addt'l properties removed 

    [DataMember]
    [Column("DataId")]
    public Int64 DataId { get; set; }


    #region Navigation Properties

    [ForeignKey("DataId")]
    public virtual ImageData ImageData { get; set; }

    #endregion

}


[DataContract]
[Table("ImageData")]
public class ImageData : IEntity
{
    [Key, ForeignKey("Image")]
    [DataMember]
    [Column("Id")]
    public Int64 Id { get; set; }

    [Column("Data")]
    [MaxLength]
    [DataType(DataType.Upload)]
    public byte[] Data { get; set; }

    public virtual Image Image { get; set; } 

}

从结构上来说,这一切看起来都不错。 问题是,当我想添加新图像时,出现以下错误。

A foreign key value cannot be inserted because a corresponding primary key value does not exist. [ Foreign key constraint name = ImageData ]

我了解错误。 我只是不确定为什么会这样。 存储库中的AddImage方法看起来像下面的代码片段,其中的“ image”参数不仅包含Image元数据,而且还包含其ImageData属性,该属性已成功填充了包含图像的byte []信息的ImageData实例。 每个实体都是新的,且ID为0。

    public static Image AddImage(Image image)
    {
        Image ret = null;
        using(Context ctx = new Context())
        {
            Image ret = ctx.Images.Add(image);
            ctx.SaveChanges();
        }
        return ret;
    }

我已经预料到,由于已将ImageData实例分配给Navigation属性,因此ADD将管理两者之间的关系,将它们插入并根据需要更新Key。 至少这就是我过去看到它的方式。

这篇文章很接近,但是他指的是一个现有实体,我希望将其创建为新实体。

谁能看到我在这里想念的东西?

更新11/05/2013

我将代码压缩为更少的行,以希望缩小问题的焦点……我仍然收到错误。

        using (Context ctx = new Context())
        {
            //
            // Initialize a ProductType instance.
            ProductType productType = ProductRepository2.GetProductType(ctx, productTypeId);
            productType.Description = txtDescription.Text.Trim();
            productType.Excerpt = txtDescription.Text.Substring(0, (txtDescription.Text.Trim().Length < 100) ? txtDescription.Text.Trim().Length : 100);

            //
            // If an image was uploaded then initialize the Image DTOs
            if (fileUpload.FileBytes.Length > 0)
            {
                ImageData imgData = new ImageData { Data = fileUpload.FileBytes };
                productType.HomePageImage = Infrastructure.Utils.ImageUtils.GetPostedImage(fileUpload.PostedFile);
                productType.HomePageImage.ImageData   = imgData;   
                productType.HomePageImage.DateAdded   = DateTime.Now;
                productType.HomePageImage.DateUpdated = DateTime.Now;
            }
            ctx.SaveChanges();
        }

您可能需要尝试使用关联而不是外键引用:

[Association("FK_MyName", "ImageId", "ImageId")]

我过去曾使用它来为RIA Services创建自定义实体

我在这里做的是创建一个ProductTpe对象,并将Image对象分配给ProductType对象中的HomePageImage属性,当我在上下文中向ProductTypes添加ProductType对象并调用saveChanges()方法时,它将在DB中创建ImageData,Image和ProductType。

ProductType prodObj = new ProductType
{
    Name="name",
    Description= "description",
    Excerpt ="excerpt",
    Image= new Image //you can directly assign your image object here
    {
        Name="name",
        ImageData=new ImageData
        {
            Data=new byte[0]; //use your data
        }
    }
};

using(Context ctx = new Context())
{
    ctx.ProductTypes.add(prodObj);
    ctx.saveChanges();
    return prodObj;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM