我有一个类模型允许我将特征图像添加到 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 属性,该属性已成功填充 ImageData 实例,该实例包含图像的 byte[] 信息。每个实体都是新的,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 将管理两者之间的关系,插入它们并根据需要更新键。至少这就是我过去看到它的工作方式。
它与这篇文章很接近,但他指的是现有实体,我希望将两者都创建为新实体。
谁能看到我在这里缺少的东西?
2013 年 11 月 5 日更新
我已将代码压缩为更少的行,以希望缩小对该问题的关注范围......我仍然收到错误消息。
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();
}