クラス モデルを使用すると、フィーチャー イメージを 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();
}