Eigene Connection Strings beim Entity Framework richtig übergeben

Der Dotnet-Doktor  –  0 Kommentare

Beim Instanziieren eines "ADO.NET Entity Framework"-Kontexts ohne Parameter im Konstruktor erwartet der Kontext, dass es eine passende Verbindungszeichenfolge (engl. Connection String) in der Konfigurationsdatei gibt.

Die Instanziierung eines Objektkontextes wie zum Beispiel

de.WWWings.Test.Modelle.EF6.WWWings6Entities context =
new de.WWWings.Test.Modelle.EF6.WWWings6Entities();

greift auf

<connectionStrings>
<add name="WWWings6Entities" connectionString="metadata=
res://*/Modelle.EF6.WWWings6.csdl|
res://*/Modelle.EF6.WWWings6.ssdl|
res://*/Modelle.EF6.WWWings6.msl;
provider=System.Data.SqlClient;
provider connection string=&quot;
Data Source=.\sqlexpress;
Initial Catalog=WWWings6;
Integrated Security=True;
MultipleActiveResultSets=True&quot;"
providerName="System.Data.EntityClient" />
</connectionStrings>

in der Konfigurationsdatei zurück.

In manchen Situationen möchte man diesen Automatismus nicht. Es lässt sich dann im Konstruktor des Kontexts entweder den Namen eines anderen Konfigurationseintrags angeben, etwa

de.WWWings.Test.Modelle.EF6.WWWings6Entities context = 
new de.WWWings.Test.Modelle.EF6.WWWings6Entities
("name=EigeneVerbindung");

oder aber eine komplette Verbindungszeichenfolge.

Wenn man aber einfach den Eintrag aus der Konfigurationsdatei in den Programmcode kopiert, wird das nicht funktionieren. Die Befehlsfolge

string CS =
@"metadata=res://*/Modelle.EF6.WWWings6.csdl|
res://*/Modelle.EF6.WWWings6.ssdl|
res://*/Modelle.EF6.WWWings6.msl;
provider=System.Data.SqlClient;
provider connection string=&quot;
Data Source=.\sqlexpress;
Initial Catalog=WWWings6;
Integrated Security=True;
MultipleActiveResultSets=True&quot;";

de.WWWings.Test.Modelle.EF6.WWWings6Entities context =
new de.WWWings.Test.Modelle.EF6.WWWings6Entities(CS);

führt zum Laufzeitfehler: Keyword not supported: 'data source'.

Zu beachten ist, dass die XML-Umschreibung "&quot;" durch ein einfaches Anführungszeichen (oder ein doppeltes Doppelanführungszeichen) zu ersetzen ist.

So klappt es:

string CS =
@"metadata=res://*/Modelle.EF6.WWWings6.csdl|
res://*/Modelle.EF6.WWWings6.ssdl|
res://*/Modelle.EF6.WWWings6.msl;
provider=System.Data.SqlClient;
provider connection string=""Data Source=.\sqlexpress;
Initial Catalog=WWWings6;
Integrated Security=True;MultipleActiveResultSets=True""";

de.WWWings.Test.Modelle.EF6.WWWings6Entities context =
new de.WWWings.Test.Modelle.EF6.WWWings6Entities(CS);