設定
次のデータ テーブルを検討してください。
*Files*
| PK_File_ID | Name |
*FileStatusLog*
| (Key) FK_File_ID | (Key) FK_Status_ID | (Key) Date |
*FileStatus*
| PK_Status_ID | Name |
上記の表は、次の Code First オブジェクトによって表されます。
public class File
{
[Key]
public int Id{ get; set; }
public string Name {get;set}
public virtual List<FileStatusLog>
}
public class FileStatusLog
{
[Column(Order = 0), Key, ForeignKey("File")]
public int Fk_File_Id { get; set; }
[Column(Order = 1), Key, ForeignKey("Status")]
public int Fk_Status_Id { get; set; }
[Column(Order = 2), Key]
public DateTime Date { get; set; }
public virtual File File { get; set; }
public virtual FileStatus Status { get; set; }
}
public class FileStatus
{
[Key]
public int Id{ get; set; }
public string Name { get; set; }
public virtual List<FileStatusLog> StatusEntries { get; set; }
}
問題
切断されたファイルを挿入するときに問題が発生します。これは、切断されたオブジェクト グラフを Entity Framework に挿入する最愛のタスクであり、依然として苦痛な試練であることに気付きましたが、以前は実行できました。私をうんざりさせているのは、多対多の関係だと思います。
ファイルに何もせずに挿入すると、の複製コピーを追加しようとしますFileStatus
。これは、切断されたオブジェクト グラフを挿入した場合に予想される副作用です。回避策は、それぞれFileStatus
がデータ コンテキストにマップされていることを確認することです。
public File Insert(File FileToInsert)
{
for (int i = 0; i < FileToInsert.FileStatusLog.Count; i++)
{
var Entry = context.Statuses.Find(FileToInsert.FileStatusLog[i].FileStatus.Id);
if (Entry != null)
{
Entry = Mapper.Map(FileToInsert.FileStatusLog[i].FileStatus, Entry);
FileStatusLog[i].FileStatus = Entry;
}
}
context.Files.Add(FileToInsert);
context.SaveChanges();
}
問題は、上記のコードが意図したとおりに機能しないことです。複合キー テーブルでは、ステータスごとに 1 行しか許可されていません。以前に使用されたステータスで新しいファイルが挿入されるたびに、その行は新しいデータFileStatusLog
によって上書きされます。File
どうすればこの結果を得ることができますか? 何もせずに、FileStatus
テーブル内のステータスを複製しようとします。Status_Id
これらのステータスをバインドしようとすると、結合テーブルにDuplicate を挿入できません。
ここで何が起こっているかについてのアイデアはありますか?