1

我有一个类模型允许我将特征图像添加到 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();
        }
4

2 回答 2

0

What I do here is I create a ProductTpe object and assign Image object to HomePageImage property in ProductType object and when I add ProductType object to ProductTypes in context and call saveChanges() method, It will create ImageData, Image and ProductType in DB.

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;
}
于 2013-11-05T04:46:40.183 回答
0

您可能需要尝试使用 Association 而不是 ForeignKey 引用:

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

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

于 2013-11-05T04:22:46.623 回答