1

設定

次のデータ テーブルを検討してください。

*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 を挿入できません。

ここで何が起こっているかについてのアイデアはありますか?

4

0 に答える 0