2017-07-31 10 views
0

私はこれは私がデータベースにChangeTracker.Entriesを保存することができるように、私はSaveChangesAsync をオーバーライドしていTransactionScopeの内側に囲んでいるときにSaveChangesAsyncをオーバーライドしますか?

public bool Save(TbArea area, bool isNew, out string errMsg) 
     { 
      try 
      { 
       errMsg = string.Empty; 
    using (var oScope = new System.Transactions.TransactionScope(TransactionScopeOption.Required, TimeSpan.FromSeconds(120))) 
        { 
         try 
         { 
          TbArea oEntity = oContext.TbArea.Where(a => a.AreaCode == area.AreaCode && a.CompanyId == MainClass.SystemCompanyId).FirstOrDefault(); 
          if (oEntity != null) 
          { 
           if (isNew) { errMsg = Resources.ResSales.MsgRecordCodeDublicated; return false; } 
           oContext.TbArea.Attach(oEntity); 
           oContext.Entry(oEntity).CurrentValues.SetValues(area); 
          } 
          else 
          { 
           if (!isNew) { errMsg = Resources.ResSales.MsgRecordNotFoundInDB; return false; } 
           oContext.TbArea.Add(area); 
          } 

          oContext.SaveChangesAsync(); 
          oScope.Complete(); 
          return true; 
         } 
         catch (Exception ex) 
         { 
          oScope.Dispose(); 
          errMsg = ex.Message; 
          return false; 
         } 
        } 

を保存するために使用されるコードで、EF取引にかなり新しいです。 このコードの一部です:

dbContext.AcceptAllChanges(); 
    logsSet.AddRange(audits); 
    int result = 0; 
    try 
     { 
     result = await dbContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); 
       //scope.Complete(); there was a transaction that I commented out, I thought it might overlaps the original transaction! 

      return result; 
     } 
    catch (Exception ex) 
      { 
      var m = ex.Message; 
      return result; 
      } 

私はアイテムを保存すると、私はエラーを取得:

私はトランザクション・スコープを削除すると、トランザクションが

を中止されました貯蓄は正常に行われます!

変更は保存が完了する前にあなたのコードは完全なトランザクションをマーキングされて
+0

なぜタイムスタンプに言及しましたか?これはログの実行操作ですか? –

+0

いいえ、削除しても同じエラーが発生しました –

+0

TransactionScopeをオーバーライドされたメソッドに移動したところで動作します –

答えて

2

oContext.SaveChangesAsync(); 
oScope.Complete(); 

あなたがawait使用する必要があります:あなたはawaitは上再開できる状況にいる場合

await oContext.SaveChangesAsync(); 
oScope.Complete(); 

を別のスレッドであれば、おそらくTransactionScopeAsyncFlowOption.Enabledを指定する必要があります。

+0

問題は、このメソッドはパラメータとして 'out string'を呼び出すので、' async'とマークすることができません! –

+0

私は完全なコード –

+0

を投稿しました。次に、すべての 'out'パラメータを含むようにあなたの戻り値の型を変更してください。 –

関連する問題