2015-01-28 7 views
7

In meiner ASP.NET MVC5 Identity 2 Anwendung versuchen, Transaktionen zu verwenden, aber es funktioniert nicht.Klicken Sie bitte den folgenden Code die Transaktionen nicht funktioniert.Wenn var saveteacher = _teacherService.Create(aTeacher); nicht erfolgreich einfügen dann AspNetUsers Rollback nicht aus der Datenbank.Verwendung von Transaktionen in ASP.NET MVC-Identität 2?

Code:

using (var dataContext = new SchoolMSDbContext()) 
{ 
    using (var trans = dataContext.Database.BeginTransaction(IsolationLevel.ReadCommitted)) 
    { 
    try 
    { 
     var adminresult =await UserManager.CreateAsync(user, teacherViewModel.Password); 
     if (adminresult.Succeeded) 
     { 
     aTeacher.Id = user.Id; 
     var saveteacher = _teacherService.Create(aTeacher); 
     } 
     else 
     { 
     trans.Rollback(); 
     ModelState.AddModelError("", adminresult.Errors.First()); 
     return View(); 
     } 
     trans.Commit(); 
    } 
    catch (Exception ex) 
    { 
     trans.Rollback(); 
     Console.WriteLine(ex.InnerException); 
    } 
    } 
} 
+0

Sieht echt aus. Hast du den Code im Debugger durchgegangen? Wird 'trans.Rollback()' jemals bei einem Fehler aufgerufen? – trailmax

+1

nein :(aber catch throw Ausnahme ex {"Validierung fehlgeschlagen für eine oder mehrere Entitäten. Siehe 'EntityValidationErrors' Eigenschaft für weitere Details."} Was ich zum Testen gemacht habe –

+0

wo ist das geworfen? Sie haben 3 Stellen in Sie Code, dass kann diese Ausnahme werfen, alle von ihnen sind in 'try-catch' verpackt, aber Sie tun' Rollback' in den Fang. Wird dieser Rollback nicht ausgeführt? – trailmax

Antwort

6

Ich denke, das Problem mit Asynchron Sachen sein könnte.

Versuchen Sie, die Transaktion wie folgt zu erstellen:

TransactionScope transaction = new TransactionScope(System.Transactions.TransactionScopeAsyncFlowOption.Enabled); 

zu den Referenzen (Sie werden System.Transactions hinzufügen müssen).

Zum Festschreiben der Transaktion gehen Sie transaction.Complete() zu Rollback tun transaction.Dispose().

+1

Awesome! Es funktionierte! Aber ich habe Frage: Wenn ich Async-Zeug entfernen dann funktioniert noch meine vorherige Code nicht. warum?. Wie auch immer, ich aktualisiere meinen Code, wie Sie gesagt haben, und jetzt funktioniert es.Vielen Dank :) –

+2

Identität arbeitet standardmäßig in async. Und die Synchronisierungsmethoden sind nur Wrapper für asynchronen Code. Also, wenn Sie Transaktionen an der Spitze hinzufügen, kommt asynchrone Natur heraus. – trailmax

+0

Dank @trailmax Ihre folgende Aussage ist so hilfreich "Identität arbeitet standardmäßig in async. Und die Synchronisierungsmethoden sind nur Wrapper für asynchronen Code." –

1

Das Problem besteht darin, dass Sie eine neue Instanz von SchoolMSDbContext erstellen, wenn Sie die vorhandene aus dem HttpContext erwerben sollten.

Beispiel:

using (var dataContext = HttpContext.GetOwinContext().Get<ApplicationDbContext>()) 
    { 
     //... 
    } 
0

Stellen Sie sicher, _teacherService und UserManager gleichen DB Kontext verwendet. Sie müssen kein TransactionScope erstellen.

Verwandte Themen