2016-04-15 51 views
0

トランザクションでは、何度もSaveChanges()を呼び出すか、一度だけ呼び出す必要がありますか?EF6トランザクション内の複数のSaveChanges関数の呼び出し

これらの違いは何ですか? ありがとうございました。

Commit()関数の前にSaveChanges()を1回だけ書くことはできますか?

using (var transaction = entities.Database.BeginTransaction()) 
{ 
    try 
    { 
     var product = entities.Product.Add(new Product() 
     { 
      Name = name, 
      Shape = shape 
     }); 

     entities.SaveChanges(); // here 

     foreach (var image in images) 
     { 

      entities.Image.Add(new Image() 
      { 
       ProductId = product.Id, 
       Url = image 
      }); 
     } 
     entities.SaveChanges(); // here 

     foreach (var specification in specifications) 
     { 

      entities.Specification.Add(new Specification() 
      { 
       Name = specification.Split(',')[0], 
       Value = specification.Split(',')[1].AsDecimal(), 
       ProductId = product.Id 
      }); 
     } 
     entities.SaveChanges(); // here 

     transaction.Commit(); 

    } 
    catch (Exception) 
    { 
     transaction.Rollback(); 
     return Json(new { status = false }); 
    } 
} 

答えて

0

あなたのセット内で必要なだけ変更し、すべての変更を加えた後に、1つのコンテキストにつき1回だけSaveChangesを呼び出します。

2

ほとんどの操作でトランザクションは必要ありません。例えば、あなたのコードは、おそらくこのように、親のナビゲーションプロパティに子エンティティを追加することによって、トランザクションなしに書き換えることができます。

var product = entities.Product.Add(new Product() 
{ 
    Name = name, 
    Shape = shape 
}); 
foreach (var image in images) 
{ 
    product.Images.Add(new Image() 
    { 
     Url = image 
    }); 
} 
foreach (var specification in specifications) 
{ 
    product.Specifications.Add(new Specification() 
    { 
     Name = specification.Split(',')[0], 
     Value = specification.Split(',')[1].AsDecimal(), 
    }); 
} 
entities.SaveChanges(); 

あなたの既存のコードは、トランザクションを必要とし、製品が追加した後のSaveChangesが必要ですトランザクションをコミットする前に終了します。これは、あなたがSaveChangesを呼び出すときにのみ生成される、追加されたエンティティのproduct.Idを参照しているためです。生成されたイメージのキーを参照していないので、コード内の2番目のSaveChangesを安全に削除できます。

関連する問題