2012-03-02 44 views
4

Entity Frameworkを使用しているときに並行処理を処理する最適な方法を探しています。 (また、スタック上の)最も単純で推奨される解決策はここに記述されている: http://msdn.microsoft.com/en-us/library/bb399228.aspx そしてそれは次のようになります。Entity Frameworkの並行処理の処理

try 
{ 
    // Try to save changes, which may cause a conflict. 
    int num = context.SaveChanges(); 
    Console.WriteLine("No conflicts. " + 
    num.ToString() + " updates saved."); 
} 
catch (OptimisticConcurrencyException) 
{ 
    // Resolve the concurrency conflict by refreshing the 
    // object context before re-saving changes. 
    context.Refresh(RefreshMode.ClientWins, orders); 

    // Save changes. 
    context.SaveChanges(); 
    Console.WriteLine("OptimisticConcurrencyException " 
    + "handled and changes saved"); 
} 

しかし、それは十分にありますか? Refresh()と2番目のSaveChanges()の間で何かが変更されるとどうなりますか? catchされていないOptimisticConcurrencyExceptionがありますか?

EDIT 2:

int savesCounter = 100; 
    Boolean saveSuccess = false; 
    while (!saveSuccess && savesCounter > 0) 
    { 
     savesCounter--; 
     try 
     { 
      // Try to save changes, which may cause a conflict. 
      int num = context.SaveChanges(); 
      saveSuccess = true; 
      Console.WriteLine("Save success. " + num.ToString() + " updates saved."); 
     } 
     catch (OptimisticConcurrencyException) 
     { 
      // Resolve the concurrency conflict by refreshing the 
      // object context before re-saving changes. 
      Console.WriteLine("OptimisticConcurrencyException, refreshing context."); 
      context.Refresh(RefreshMode.ClientWins, orders); 

     } 
    } 

私はIunderstandはリフレッシュ()どのように動作するかかどうかわからないです:

私はこれが最終的な解決策になると思います。全体の文脈をリフレッシュしますか?はいの場合、追加の引数(エンティティオブジェクト)はなぜ必要ですか?または、指定されたオブジェクトのみをリフレッシュしますか?

Order dbOrder = dbContext.Orders.Where(x => x.ID == orderID); 
dbOrder.Name = "new name"; 
//here whole the code written above to save changes 

はそれがdbOrderする必要があります:リフレッシュ()2番目の引数として渡されるべきか、この状況では例えば ?

+2

+1これは私が最初に読んだときにこの例に対して私が持っていたのと同じ異論でした!通常、「危険な」操作(saveChanges)を例外ハンドラで実行するのは悪い習慣です。私は公式の文書でこれを見ることに驚いた。 –

+1

Re:あなたの変更、それはよさそうだ。 100回の再試行で状況を改善できないと言うと、おそらくループを壊す方法をとることに注意しています。終わりのないループで終わる問題をデバッグするのは常に困難です。彼らは決して起こるべきではありません:-) –

+1

このリンクでアプローチを試してください。それは、より信頼できるapprachかもしれないconcurrenyを扱う別の方法を使用します: - http://www.asp.net/mvc/tutorials/asf-net-mvc-applicationのエンティティフレームワークを使用したe-fc-using-mvc/handling-concurrent-processing –

答えて

4

はい、2番目の保存でさえ、Refresh()SaveChanges()の間で変更された場合、OptimisticConcurrencyExceptionが発生する可能性があります。

この例は、非常に単純なリトライロジックです。複数回再試行する必要がある場合や、より複雑な方法で競合を解決する必要がある場合は、ループを作成してn回try /この1つ以上のレベルをキャッチします。

関連する問題