2017-07-31 7 views
0

Je suis assez nouveau pour les transactions EF, c'est le code qui est utilisé pour sauverSubstitution de SaveChangesAsync lorsqu'il est inclus dans TransactionScope?

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; 
         } 
        } 

Je suis remplaçant SaveChangesAsync pour que je puisse enregistrer le ChangeTracker.Entries dans la base de données. ceci est une partie du code:

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; 
      } 

Lorsque j'enregistre un élément, je reçois l'erreur:

la transaction a avorté

lorsque je retire la portée de transaction, la l'économie se produit normalement!

+0

Pourquoi avez-vous mentionné l'horodatage ?? Est-ce une opération de journalisation? –

+0

Non, je l'ai enlevé et toujours obtenir la même erreur –

+0

J'ai déplacé le TransactionScope à la méthode substituée et cela fonctionne maintenant –

Répondre

2

Votre code marque le transaction complète avant que les modifications ont fini d'enregistrer:

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

Vous devez utiliser await:

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

Si vous êtes dans un contexte où await peut reprendre sur un fil différent, vous aurez probablement besoin de spécifier TransactionScopeAsyncFlowOption.Enabled.

+0

Le problème est que cette méthode prend 'out string' comme paramètre, donc je ne peux pas le marquer' async'! –

+0

J'ai posté le code complet –

+0

Ensuite, changez votre type de retour pour inclure tous les paramètres 'out'. –