1

クラス モデルを使用すると、フィーチャー イメージを ProductType エンティティに追加できます。個々の ProductType クラス定義は、特定の画像を参照する HomePageImageId および HomePageImage ナビゲーション プロパティを識別します。

画像のすべての META 情報 (幅、高さ、フォーマット タイプ、名前など) を含む Image クラス定義があります。

実際の画像データを含む 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 メタデータだけでなく、イメージの byte[] 情報を含む ImageData のインスタンスが正常に設定された 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 が 2 つの関係を管理し、それらを挿入し、必要に応じてキーを更新すると予想していました。少なくとも、私は過去にそのように動作するのを見てきました。

この投稿に近いですが、彼が既存のエンティティに言及している場合、私は両方を新しいエンティティとして作成しようとしています。

ここで私が見逃しているものを見ることができますか?

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

ForeignKey 参照ではなく、Association を使用してみる必要がある場合があります。

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

過去にこれを使用して、RIA サービスのカスタム エンティティを作成しました。

于 2013-11-05T04:22:46.623 に答える
0

ここで行うことは、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;
}
于 2013-11-05T04:46:40.183 に答える