7

.NET 4、MVC 4、Entity Framework 5、SQL Server を使用。

1 つのトランザクションに新しいヘッダー レコードと、挿入されたヘッダー レコードへの外部キーを持ついくつかの新しい HeaderData レコードを挿入したいと考えています。ヘッダー レコードには Identity int 主キーがあります。

Entities.Header h = new Entities.Header();

h.Name = name;
h.Time = DateTime.Now;
h.Comments = comments;

db.Headers.Add(h);
// db.SaveChanges(); // Save changes here?
// and get ID to use below via h.ID?

foreach (DataRecord dr in datarecords) // my own custom types here
{
    Entities.HeaderData hd = new Entities.HeaderData();
    // hd.header = thisid // ?? this is the FK to Header.ID, its Identity int PK
    hd.name = dr.name
    hd.value = dr.value

    db.HeaderDatas.Add(hd)
}

db.SaveChanges(); // or wait to save all here? 

問題は、ヘッダー レコード ID がコミットされるまで、データ レコードの FK フィールドに入れられるものがわからないことです。それとも私ですか?SaveChanges/Commit が機能しない前に h.ID を参照するだけで、0 が返されました。

オプション: 1) 最初にヘッダー レコードをコミットし、使用する PK を取得してから、データ レコード モデルを入力し、それらを個別にコミットする必要がありますか? そのような場合、ヘッダーのロールバックを行う必要があるかもしれませんが、最適な方法とは言えません。

2) 代わりに GUID PK などを使用する必要がありますか? ここでアプリで作成しますか? とにかくそこからレコードを追加できる唯一の場所です。

3) Entity Framework (一時的な EntityKey でしょうか?) に巧妙な方法がありますか? データ レコードの FK フィールドに正しいヘッダー ID を自動的に配置するように、トランザクションを挿入しますか? これは EF で実行できるようですが、それへの参照を正確に見つけることができませんでした。

4

2 に答える 2

9

HeaderHeaderDataが外部キー (1 対多) の関係によって関連付けられている場合は、ナビゲーション コレクションHeader.HeaderDatas(タイプICollection<HeaderData>または別のコレクション タイプ)Headerまたはナビゲーション参照HeaderData.Header(タイプHeader)HeaderDataまたはその両方が必要です。

いずれの場合も、これらのナビゲーション プロパティを使用して関係を構築することをお勧めします。

Entities.Header h = new Entities.Header();
h.HeaderDatas = new List<HeaderData>();
// ...
foreach (DataRecord dr in datarecords)
{
    Entities.HeaderData hd = new Entities.HeaderData();
    //...
    h.HeaderDatas.Add(hd)
}
db.Headers.Add(h);
db.SaveChanges();

または:

Entities.Header h = new Entities.Header();
// ...
foreach (DataRecord dr in datarecords)
{
    Entities.HeaderData hd = new Entities.HeaderData();
    //...
    hd.Header = h;

    db.HeaderDatas.Add(hd);
}
db.SaveChanges();

FK を直接設定する必要はありません。EF は、設定したナビゲーション プロパティを、データベース テーブルに必要な外部キー値に正しく "変換" します。

于 2013-03-29T17:26:29.717 に答える