2016-09-11 1 views
1

私は、新しいプロジェクトでEntity Framework 6を​​使用しています。Entity Frameworkを使用してトランザクション内で2つのクエリを実行する方法は?

同じトランザクションで2つの異なるクエリを実行してからコミットする必要があります。しかし、2番目のクエリでは、最初のクエリで生成されたIDが必要です。ここで

は私が

[HttpPost] 
[ValidateAntiForgeryToken] 
public JsonResult Add(ManageEmployeeAddTimeDialog model) 
{ 
    bool added = false; 

    if (ModelState.IsValid) 
    { 
     using (var conn = new BaseContext()) 
     { 
      using (var dbTransaction = conn.Database.BeginTransaction()) 
      { 
       try 
       { 
        var entry = conn.Entry.Add(new Entry(model)); // entry.Id is always 0! 

        conn.EntryRevision.Add(new EntryRevision(entry)); // this command needs the last inserted id aka entry.Id 

        conn.SaveChanges(); // Save changes? 

        added = true; 

        dbTransaction.Commit(); 
       } 
       catch (Exception) 
       { 
        dbTransaction.Rollback(); 
        throw; 
       } 
      } 
     } 
    } 

    return Json(new { Added = added }); 
} 

をやっていることであるトランザクションは、私がデータベースにコミットレコードの両方を取得して正常に動作しているようです。しかし、2番目のレコードは、最後に挿入されたIDではなく、が0になります。

ここで私は何をしていますか?トランザクションで最後に挿入されたIDを取得するにはどうすればよいですか?

+0

のように見えるのだろうか? EntryRevision-> Entry関係にFKを定義すると、自動的に保存されます。あなたのシナリオでは、その機能を使わないようにしていますか? –

答えて

1

最初の追加後にconn.SaveChanges();に電話する必要があります。これは新しいIDを作成するデータベースに挿入を適用します。このIDは、コミットが呼び出されるまでデータベースに保存されません。

あなたが入力とEntryRevisionのためのあなたのマッピングを含めることができますので、あなたのコードはとても

[HttpPost] 
[ValidateAntiForgeryToken] 
public JsonResult Add(ManageEmployeeAddTimeDialog model) 
{ 
    bool added = false; 

    if (ModelState.IsValid) 
    { 
     using (var conn = new BaseContext()) 
     { 
      using (var dbTransaction = conn.Database.BeginTransaction()) 
      { 
       try 
       { 
        var entry = conn.Entry.Add(new Entry(model)); 

        conn.SaveChanges(); 

        conn.EntryRevision.Add(new EntryRevision(entry)); 

        conn.SaveChanges(); 

        added = true; 

        dbTransaction.Commit(); 
       } 
       catch (Exception) 
       { 
        dbTransaction.Rollback(); 
        throw; 
       } 
      } 
     } 
    } 

    return Json(new { Added = added }); 
} 
関連する問題