2

Une question similaire a été posée here mais n'a pas eu de réponse.Support SQL CE 4 System.Transaction

Je tente d'utiliser un System.Transactions.CommittableTransaction avec EF CTP4 et SQL CE 4.

J'ai créé l'attribut transaction suivante pour mes actions ASP.NET MVC Controller:

public class TransactionAttribute : ActionFilterAttribute 
{ 
    CommittableTransaction transaction; 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     transaction = new CommittableTransaction(); 
     Transaction.Current = transaction; 
     base.OnActionExecuting(filterContext); 
    } 

    public override void OnResultExecuted(ResultExecutedContext filterContext) 
    {   
     base.OnResultExecuted(filterContext); 

     try 
     { 
      var isValid = filterContext.Exception == null || filterContext.ExceptionHandled; 
      if (filterContext.Controller.ViewData.ModelState.IsValid && isValid) { 
       transaction.Commit(); 
      } else { 
       transaction.Rollback(); 
       Transaction.Current = null; 
      } 
     } 
     finally 
     { 
      transaction.Dispose(); 
     } 
    } 
} 

Lorsque j'utilise ce filtre, j'obtiens l'erreur:

System.InvalidOperationException: L'objet de connexion ne peut pas être enrôlé dans la portée de la transaction.

Cependant, le test suivant passe:

[Test] 
    public void Transaction_rolls_back_if_exception() 
    { 
     var transaction = new CommittableTransaction(); 
     Transaction.Current = transaction; 

     try 
     { 
      var project = new Project { Title = "Test" }; 
      projectRepo.SaveOrUpdate(project); 

      context.SaveChanges(); 

      var post = new Post { Title = "Some post" }; 
      blogRepo.SaveOrUpdate(post); 

      throw new Exception(); 

      context.SaveChanges(); 

      transaction.Commit(); 
     } 
     catch (Exception ex) 
     { 
      transaction.Rollback(); 
      Transaction.Current = null; 
     } 

     projectRepo.GetAll().Count().ShouldEqual(0); 
     blogRepo.GetAll().Count().ShouldEqual(0); 
    } 

a ce quelque chose à voir avec la façon dont je suis le DbContext Initialisation?

Répondre

2

J'ai rencontré ce même problème. Vous ne pouvez pas utiliser de transactions avec la connexion CE. J'ai fini par avoir mon datacontext pour gérer ma connexion CE et implémenter un modèle d'unité de travail pour contenir mes actions, puis exécuter toutes les actions planifiées dans un SqlCeTransaction puis appeler moi-même commit ou rollback.

http://msdn.microsoft.com/en-us/library/csz1c3h7.aspx