12
votes

Créer une instruction de base de données non autorisée dans la transaction multi-instruction

J'essaie de construire un test rapide qui supprime et recrée une base de données chaque fois qu'elle fonctionne. J'ai ce qui suit: xxx

Cependant, lorsque j'exécute le test, j'obtiens l'erreur suivante:

Message de résultat: méthode de test Projet.repository.unittestS.pocotest.estbasicoperations jeté Exception: system.data.sqlclient.sqxception: créer une base de données Déclaration non autorisée dans la transaction multi-instruction.

ProjectDataSource est ici: xxx

référentiel: xxx

Pourquoi cela se produit-il?

Aussi - si cela fait une différence - l'erreur ne se produit pas si je commencez la ligne Additem dans TestMethod.


0 commentaires

6 Réponses :


3
votes

Si quelqu'un d'autre circule dans ce numéro:

Dans ma classe de référentiel, j'ai une autre définition de ce qui est communément étiqueté "dBContext" - ProjectDataSource. Cela signifie qu'un contexte a été créé dans ma classe de test, tandis qu'un autre a été créé dans mon objet de référentiel. Envoi des connexions à ma classe de repo résolu le problème:

dans le référentiel: xxx

de mon test: xxx


2 commentaires

Je ne comprends pas complètement pourquoi ce problème est causé. Êtes-vous en train de dire que la création d'une instance de DBContext équivalente provoque le problème. Ce qui signifie qu'un seul dBContext à une DB spécifique peut exister dans l'application?


Eran Otzap, je sais que c'est un moyen de retard, mais avoir fait face à cette question aujourd'hui, je pensais qu'il serait utile de publier une réponse expliquant les causes profondes. J'espère que ça aide.



3
votes

Vous ne pouvez pas utiliser les engagements implicites autour de certaines commandes SQL. La création et la suppression de bases de données sont un exemple SQL Server fera un autocommit

Voir la section Remarques de l'aide MS SQL. http://msdn.microsoft.com/en-us/library/ms176061.aspx

Et quelque chose sur l'auto commit pour plus d'informations ... http://msdn.microsoft.com/en-us /Library/ms187878%28V=SQL.105%29


0 commentaires

5
votes

Vous pouvez également utiliser db.database.executesqlcommand (transactionalbehavior.donotensuretransaction, sqlcommand);

voir https://stackoverflow.com/a/24344654/375114 pour plus de détails


0 commentaires

4
votes

Pour vos informations, cette erreur se produit par la conception et cela se produit chaque fois que les commandes non transacacable sont émises à Microsoft SQL Server dans une transaction active.

La solution consiste donc à accorder que base de données.Creatsfnotexists () frappe la base de données de toute portée de transaction. N'oubliez pas que PROFILER SQL est votre ami.

Vous pouvez obtenir un "http://infocenter.ysbase.com/help/index.jsp?topic=/index.jsp?topic=/com.ybase.infocenter.dc00729.frc00729.1500/html/errmessageAdvRes/babfdfib.htm" rel = "nofollow NOREFERRER"> Liste mise à jour des commandes qui ne sont pas autorisées à exécuter Whithin Transactions .

Remarque: au cas où une merveille, pourquoi suis-je en train de fournir une liste basée sur un produit Sybase, gardez à l'esprit que Microsoft SQL Server partage la plupart de son génétique de base avec le moteur Sybase '. Pour une lecture supplémentaire, reportez-vous à https://fr.wikipedia.org/wiki/microsoft_sql_server < / p>


0 commentaires

0
votes

Essayez ce code

Utilisation (transactionsCOPE TS = Nouveau transactionsCope (transactionsCOPOPtion.Suppress))

{
var sqlcommand = string.format ("Créer une base de données [{0}]", "TempBackUpdb"); _Context.database.executesqlCommand (transactionnementBehavior.donotensureTansaction, SQLCommand);

TS.COMPLETE ();

}


1 commentaires

Crée seulement une base de données vide. Alors quoi?



-1
votes

Vous devez exécuter Base de données de mise à jour sur la console de gestionnaire de packages.


1 commentaires

Comment feriez-vous cela dans une méthode de test unitaire?