Dans mon application ASP.NET MVC5 Identity 2 Application Essayant d'utiliser des transactions, mais elle ne fonctionne pas.Veuillez voir le code ci-dessous les transactions qui ne fonctionnent pas.Si Code: P> var fileacher = _Teacherservice.create (compactère); code> Ne pas insérer avec succès, ASPNetusers pas Rollback de la base de données.
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);
}
}
}
3 Réponses :
Je pense que le problème pourrait être avec async.
Essayez de créer la transaction comme ceci: p> (vous devez ajouter pour commettre transaction aller Système. Transactions code>) aux références. P>
transaction.comPlete () code> à la restauration do
transaction.dispose () code>. p> p>
Impressionnant ! Ça a marché ! Mais j'ai des questions: si je suppose que je suppose que mon code précédent ne fonctionne pas .Pourquoi, je mettez à jour mon code comme vous l'avez dit et que cela fonctionne maintenant.
L'identité par défaut fonctionne en ASYNC. Et les méthodes de synchronisation ne sont que des emballages pour le code ASYNC. Donc, si vous ajoutez des transactions sur le dessus, ASYNC Nature sort.
Merci @trailmax Votre relevé ci-dessous est tellement utile "L'identité par défaut fonctionne dans ASYNC. Et les méthodes de synchronisation ne sont que des emballages pour le code ASYNC."
transaction.dispose () pour la restauration? Pas sûr, si cela a raison, parce que vous devez disposer de la transaction quand même! La méthode complète engage la transaction. Si une exception a été lancée, la complète n'est pas appelée et la transaction est renvoyée.
@Legends Non, vous n'avez pas à appeler explicitement Disposer code>. Utiliser
en utilisant la déclaration code> avec la portée de la transaction est suffisamment bonne. Voir l'exemple de code ICI: msdn.microsoft.com/en-us/Library/...
Le problème est que vous créez une nouvelle instance de SchoolMsDBContext lorsque vous devez acquérir l'existant du HttpContext.
Exemple: p>
Assurez-vous que _Teacherservice code> et
usermanager code> utilise le même contexte de DB. Pas besoin de créer un transaction. P>
Semble légitime. Avez-vous parcouru le code dans le débogueur? Est
trans.rollback () code> déjà appelé erreur?
non :( mais attraper une exception exception ex {"La validation a échoué pour une ou plusieurs entités. Voir la propriété" EntityValidationErrors "pour plus de détails."} que j'ai fait pour tester
Où est-ce que ceci est jeté? Vous avez 3 places dans votre code qui peuvent lancer cette exception, toutes sont enveloppées dans
try-attraper code>, mais vous faites
Rollback code> dans la prise. Ce retour n'est-il pas exécuté?
Pas de capture 'Rollback' Ne rien faire! Je le teste sans USERERMANAGER.CREATEASYNC et utilisez un autre modèle comme classe et cela a fonctionné. Je ne sais pas pourquoi usermanager.createasync (...) ne fonctionne pas!