Ik gebruikte een .mdf
bestand om verbinding te maken met een database
en entityClient
. Nu wil ik de connectie string veranderen, zodat er geen .mdf
bestand is.
Is de volgende connectionString
correct?
<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" />
Omdat ik steeds de foutmelding krijg:
De onderliggende provider is mislukt bij Open
Ik had deze fout en vond een paar oplossingen:
Kijkend naar je connectie string, het ziet er geldig uit. Ik vond deze blog post, het probleem hier is dat ze Geïntegreerde Beveiliging gebruikten. Als je op IIS draait, heeft je IIS gebruiker toegang nodig tot de database.
Als je Entity Framework met Transacties gebruikt, opent en sluit Entity Framework automatisch een verbinding bij elke database-aanroep. Dus als je transacties gebruikt, probeer je een transactie uit te smeren over meerdere verbindingen. Dit verheft zich tot MSDTC.
(Zie deze referentie voor meer informatie.)
Het veranderen van mijn code in de volgende loste het op:
using (DatabaseEntities context = new DatabaseEntities())
{
context.Connection.Open();
// the rest
}
context.Connection.Open()
hielp niet om mijn probleem op te lossen dus probeerde ik "Allow Remote Clients" in te schakelen in DTC config, geen fout meer.
In windows 7 kun je de DTC config openen door dcomcnfg uit te voeren, Component Services -> Computers -> Mijn Computer -> Distributed Transaction Coordinator -> Klik met de rechtermuisknop op Local DTC -> Security.
Ik ontdekte dat het probleem was dat ik het serverpad in de verbindingsstring had in een van deze varianten:
SERVER\SQLEXPRESS
SERVER
Terwijl ik eigenlijk zou moeten hebben:
.\SQLEXPRESS
Om de een of andere reden kreeg ik de foutmelding wanneer het moeite had om de instantie van SQL te lokaliseren.