使用entity framework添加具有新导航属性的新实体

我有一个类模型允许我将一个functionImage添加到ProductType实体。 单个ProductType类定义标识引用特定Image的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更新为neeccessary。 至少这是我过去看到它的工作方式。

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

谁能看到我在这里失踪的东西?

更新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  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而不是ForeignKey引用:

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

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

我在这里做的是创建一个ProductTpe对象并将Image对象分配给ProductType对象中的HomePageImage属性,当我在上下文中将ProductType对象添加到ProductTypes并调用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; }