2015-01-28 24 views
7

In My ASP.NET MVC5 Identity 2 Applicazione che tenta di utilizzare le transazioni ma non funziona. Si prega di consultare il codice sottostante le transazioni non funzionanti.Se var saveteacher = _teacherService.Create(aTeacher); non si inserisce correttamente allora AspNetUsers non esegue il rollback dal database.Come utilizzare le transazioni nell'identità ASP.NET MVC 2?

Codice:

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

Sembra legittimo. Hai fatto il codice nel debugger? 'Trans.Rollback()' ha mai chiamato un errore? – trailmax

+1

no :(ma catch throw Eccezione ex {"Convalida non riuscita per una o più entità Vedere la proprietà 'EntityValidationErrors' per ulteriori dettagli."} Che ho fatto per testare –

+0

da dove viene generata? Hai 3 posizioni nel codice che può lanciare questa eccezione, tutti sono racchiusi in 'try-catch', ma si esegue il' rollback' nel catch.È questo rollback non eseguito? – trailmax

risposta

6

Penso che il problema potrebbe essere con roba asincrono.

provare a creare la transazione come questo:

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

(dovrete aggiungere System.Transactions) per i riferimenti.

Per eseguire la transazione, passare transaction.Complete() al rollback fare transaction.Dispose().

+1

Impressionante! Funzionava! Ma ho una domanda: se rimuovo le cose asincrone, il mio codice precedente non funziona ancora. perché?. In ogni caso aggiorno il mio codice come hai detto e ora funziona. Grazie :) –

+2

L'identità per impostazione predefinita funziona in modo asincrono. E i metodi di sincronizzazione sono solo wrapper per il codice asincrono. Quindi, se aggiungi le transazioni in cima, viene fuori la natura asincrona. – trailmax

+0

Grazie @trailmax la tua seguente affermazione è così utile "L'identità per impostazione predefinita funziona in modalità asincrona e i metodi di sincronizzazione sono solo wrapper per codice asincrono." –

1

Il problema è che si sta creando una nuova istanza di SchoolMSDbContext quando si deve acquisire quella esistente da HttpContext.

Esempio:

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

Assicurarsi _teacherService e UserManager utilizza stesso contesto DB. Non è necessario creare un TransactionScope.