3

Je tente d'effectuer des tests fonctionnels sur une base de données en ligne, pour m'assurer que mes requêtes linq sont correctement traduites en SQL. Je veux le faire en utilisant des transactions, de sorte qu'un test fonctionnel n'affecte pas un autre.Comment affectez-vous une transaction avec EF4 CodeFirst CTP5 sans utiliser TransactionScopes?

Le problème est que je ne trouve aucun moyen dans l'API d'utiliser correctement les transactions. Je peux récupérer un nouveau DbTransaction via MyDbContext.Database.Connection.BeginTransaction(), cependant, je ne trouve pas de toute façon d'utiliser réellement cette transaction.

Toute la documentation que je peux trouver à propos de l'appel BeginTransaction(), est que vous affectez l'objet de transaction au SqlCommand via un appel cmd.Transaction pour la commande avec laquelle vous effectuez des actions. Cependant, avec EF4 CTP5, il n'y a aucun moyen d'accéder au SqlCommand utilisé pour les requêtes.

Ainsi, je ne peux pas comprendre comment utiliser la transaction que j'ai commencé avec BeginTransaction(). Je ne veux pas utiliser les objets TransactionScope, principalement parce que Sql CE 4 ne les supporte pas, et je préférerais utiliser une base de données locale et ne pas traverser un réseau. Sql CE 4 prend en charge les transactions récupérées via BeginTransaction(), je ne peux tout simplement pas comprendre comment avec le code d'abord.

Est-ce que quelqu'un a une idée de comment faire cela?


Modifier: Après quelques e-mails avec Microsoft, il semble que TransactionScope() appels sont destinés à être le principal moyen d'utiliser des transactions avec EF4. Pour obtenir TransactionScope travailler avec Sql CE, vous devez ouvrir explicitement la connexion de base de données avant de commencer la transaction, par exemple

[TestMethod] 
    public void My_SqlCeScenario() 
    { 
     using (var context = new MySQLCeModelContext()) //ß derived from DbContext 
     { 
      ObjectContext objctx = ((IObjectContextAdapter)context).ObjectContext; 
      objctx.Connection.Open(); //ß Open your connection explicitly 
      using (TransactionScope tx = new TransactionScope()) 
      { 

       var product = new Product() { Name = "Vegemite" }; 
       context.Products.Add(product); 
       context.SaveChanges(); 
      } 
      objctx.Connection.Close(); //ß close it when done! 
     } 
    } 

Répondre

2

Peut-être que cet article sur MSDN pourrait aider Managing Connections & Transactions puis faites défiler jusqu'à la rubrique Transactions et Entity Framework. C'est là que je commencerais.

EDIT: est ici un meilleur: How To: Manage Transactions in the Entity Framework

+0

Le deuxième article utilise TransactionScopes, que je ne peux pas utiliser. Le premier article était bon mais ne semble pas aider. On dirait que CTP5 est buggé et 'EnlistTransaction()' ne fonctionne pas correctement, car 'Context.SaveChanges()' déclenche toujours la création d'une nouvelle transaction, causant ainsi une exception due aux transactions imbriquées – KallDrexx

+0

Je suis désolé, je semblais négliger la partie sur l'utilisation de SQL CE et ne pas soutenir TransactionScopes, laissez-moi voir si je peux trouver quelque chose de mieux – PsychoCoder

+0

Pas de soucis, je vous ai quand même donné rep :). Plus je lis ces liens, plus il semble que EF4 a des bugs et des problèmes de conception en ce qui concerne les transactions dans leur ensemble. J'ai fini par envoyer un courriel à Scott Guthrie, et je posterai ici si j'obtiens une réponse. – KallDrexx

1

C'est ringard, mais peut-être votre seule option ici:

((EntityConnection)myObjectContext.Connection).StoreConnection.BeginTransaction(... 
Questions connexes