[英]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.