7
votes

Comment utiliser des transactions dans ASP.NET MVC Identity 2?

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 var fileacher = _Teacherservice.create (compactère); code> Ne pas insérer avec succès, ASPNetusers pas Rollback de la base de données.

Code: P>

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


4 commentaires

Semble légitime. Avez-vous parcouru le code dans le débogueur? Est trans.rollback () 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 , mais vous faites Rollback 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!


3 Réponses :


7
votes

Je pense que le problème pourrait être avec async.

Essayez de créer la transaction comme ceci: xxx

(vous devez ajouter Système. Transactions ) aux références.

pour commettre transaction aller transaction.comPlete () à la restauration do transaction.dispose () .


5 commentaires

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 . Utiliser en utilisant la déclaration avec la portée de la transaction est suffisamment bonne. Voir l'exemple de code ICI: msdn.microsoft.com/en-us/Library/...



1
votes

Le problème est que vous créez une nouvelle instance de SchoolMsDBContext lorsque vous devez acquérir l'existant du HttpContext.

Exemple: xxx


0 commentaires

0
votes

Assurez-vous que _Teacherservice et usermanager utilise le même contexte de DB. Pas besoin de créer un transaction.


0 commentaires