J'utilisais un fichier .mdf
pour me connecter à une database
et à un entityClient
. Maintenant, je veux changer la chaîne de connexion pour qu'il n'y ait pas de fichier .mdf
.
La chaîne de connexion suivante est-elle correcte ?
<connectionStrings>
<!--<add name="conString" connectionString="metadata=res://*/conString.csdl|res://*/conString.ssdl|res://*/conString.msl;provider=System.Data.SqlClient;provider connection string="Data Source=.\SQL2008;AttachDbFilename=|DataDirectory|\NData.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />-->
<add name="conString" connectionString="metadata=res://*/conString.csdl|res://*/conString.ssdl|res://*/conString.msl;provider=System.Data.SqlClient;provider connection string="Data Source=.\SQL2008;Initial Catalog=NData;Integrated Security=True;Connect Timeout=30;User Instance=True;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />
Parce que je reçois toujours l'erreur :
Le fournisseur sous-jacent a échoué lors de l'ouverture
J'ai eu cette erreur et j'ai trouvé quelques solutions :
En regardant votre chaîne de connexion, elle semble valide. J'ai trouvé [cet article de blog][1], le problème ici est qu'ils utilisaient [Integrated Security][2]. Si vous utilisez IIS, votre utilisateur IIS doit avoir accès à la base de données.
Si vous utilisez [Entity Framework][3] [avec des transactions][4], Entity Framework ouvre et ferme automatiquement une connexion à chaque appel à la base de données. Ainsi, lorsque vous utilisez des transactions, vous essayez de répartir une transaction sur plusieurs connexions. Cette situation est à l'origine de [MSDTC][5].
([Voir cette référence pour plus d'informations.][6])
Le changement de mon code par le suivant a réglé le problème :
using (DatabaseEntities context = new DatabaseEntities())
{
context.Connection.Open();
// the rest
}
[1] : http://th2tran.blogspot.com/2009/06/underlying-provider-failed-on-open.html [2] : http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnectionstringbuilder.integratedsecurity.aspx [3] : http://msdn.microsoft.com/en-us/library/aa697427(VS.80).aspx [4] : https://stackoverflow.com/questions/452129/entity-framework-using-transactions-and-rollbacks-possible [5] : http://en.wikipedia.org/wiki/Distributed_Transaction_Coordinator [6] : http://msdn.microsoft.com/en-us/library/bb738698.aspx
context.Connection.Open()
n'a pas aidé à résoudre mon problème, j'ai donc essayé d'activer l'option "Allow Remote Clients" ; dans la configuration du DTC, plus d'erreur.
Dans Windows 7, vous pouvez ouvrir la configuration DTC en exécutant dcomcnfg, Component Services -> Computers -> My Computer -> Distributed Transaction Coordinator -> Right click to Local DTC -> Security.
J'ai découvert que le problème venait du fait que le chemin du serveur se trouvait dans la chaîne de connexion dans l'une de ces variantes :
SERVER\SQLEXPRESS
SERVER
Alors que j'aurais dû le faire :
.\SQLEXPRESS
Pour une raison quelconque, j'ai eu l'erreur quand il a eu des difficultés à localiser l'instance de SQL.