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: Cependant, lorsque j'exécute le test, j'obtiens l'erreur suivante: p> 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. P>
BlockQuote> ProjectDataSource est ici: p> référentiel: p> Pourquoi cela se produit-il? P> Aussi - si cela fait une différence - l'erreur ne se produit pas si je commencez la ligne Additem dans TestMethod. p> p>
6 Réponses :
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: P>
dans le référentiel: p> de mon test: p>
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.
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 fort> p>
Voir la section Remarques de l'aide MS SQL.
http://msdn.microsoft.com/en-us/library/ms176061.aspx p>
Et quelque chose sur l'auto commit pour plus d'informations ...
http://msdn.microsoft.com/en-us /Library/ms187878%28V=SQL.105%29 P>
Vous pouvez également utiliser voir https://stackoverflow.com/a/24344654/375114 pour plus de détails p> db.database.executesqlcommand (transactionalbehavior.donotensuretransaction, sqlcommand); code> p>
Pour vos informations, cette erreur se produit par la conception et cela se produit chaque fois que les commandes non transacacable em> sont émises à La solution consiste donc à accorder que base de données.Creatsfnotexists () Strong> frappe la base de données de toute portée de transaction. N'oubliez pas que 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 . P>
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>
Essayez ce code P>
Utilisation (transactionsCOPE TS = Nouveau transactionsCope (transactionsCOPOPtion.Suppress)) P>
{
var sqlcommand = string.format ("Créer une base de données [{0}]", "TempBackUpdb");
_Context.database.executesqlCommand (transactionnementBehavior.donotensureTansaction, SQLCommand); P>
TS.COMPLETE (); P>
} p>
Crée seulement une base de données vide. Alors quoi?
Vous devez exécuter
Comment feriez-vous cela dans une méthode de test unitaire?