2016-06-08 11 views
2

Ich erstelle eine Anwendung, die Entity Framework verwendet; speziell Datenbank zuerst.Entity Framework-Laufzeit ConnectionString bei Verwendung der Datenbank zuerst

Wenn sich der Benutzer anmeldet, wird zur Laufzeit ein ConnectionString erstellt, der dann für die Datenverarbeitung in der Anwendung verwendet werden soll.

ich gefunden habe bereits eine Reihe von Lösungen für diese im Internet, die darauf hindeuten, dass die Art und Weise, dies zu tun ist, einen anderen Konstruktor für die DbContext Klasse zu implementieren, die erstellt wird, die die Basis DbContext(string) nennt:

public ApplicationDbContext(SqlConnection Connection) 
      : base(Connection.ConnectionString) 
     { 
     } 

Dies habe ich in einer separaten Datei erstellt, die eine public partial class des generierten Codes ist, um jeden weiteren generierten Code zu berücksichtigen, der überschreibt, was sich bereits in diesen Dateien befindet.

Wenn jedoch die Anwendung ausgeführt wird, sobald eine ApplicationDbContext wird diese zusätzliche Konstruktor erstellt, wird die folgende Ausnahme ausgelöst:

„Der Zusammenhang mit dem Code in der Code-Erste-Modus verwendet wird, die erzeugt wurde aus einer EDMX-Datei für entweder Database First oder Model First-Entwicklung ... "

Dies würde Sinn machen, da ich einen Datenbank-Ansatz verwende. Alle Antworten, die ich gesehen habe, wo Database First verwendet wird, schlagen jedoch vor, dies zu tun.

Nachdem auf MSDN ein wenig weiter in sie sah, wie ich sehe, dass es tatsächlich eine andere DbContext Konstruktor ist, die ich verwenden könnte: DbContext(String, DbCompiledModel). Ich frage mich, ob das ist, was ich vermisse und das ist der Konstruktor, den ich brauche, da ich gesagt hätte, dass ich ein kompiliertes Modell verwende (... oder bin ich?).

Ist dies jedoch der richtige Weg, oder muss dies anders gehandhabt werden?

+0

[Verbinden mit Datenbank für Multi-Tenant-Anwendung?] (Http://stackoverflow.com/questions/32717832/connecting-to-database-for-multi-tenant-application) –

+0

Danke für die Rückmeldung; aber ich habe versucht, den ConnectionString auf diese Weise zu erstellen, und ich bekomme immer noch den gleichen Fehler. Ich überprüfte das Format des ConnectionString in App.config, um die gleichen Parameter zu replizieren, die in dem ConnectionString sind, der standardmäßig verwendet wird, aber wenn ich versuche, den ConnectionString mithilfe dieser Daten zu erstellen, erhalte ich den Fehler "Schlüsselwort nicht unterstützt" für 'provider', 'connectionstring' und für 'provider connection string'. Wenn man diese entfernt, kann man die Zeichenkette konstruieren, aber wie gesagt, führt das gerade zum ursprünglichen Fehler. –

+0

Das Problem liegt in der Verbindungszeichenfolge, die an den Konstruktor übergeben wird. –

Antwort

1

Zuerst einen Konstruktor Überlastung zu Ihrer Kontextklasse fügen Sie ein string als Verbindungszeichenfolge zu akzeptieren:

public TestDBEntities() 
    : base("name=TestDBEntities") 
{ 
} 
public TestDBEntities(string connectionString) 
    : base(connectionString) 
{ 
} 

dann die Verbindungszeichenfolge verwenden in Ihrem app.config oder web.config. Sie sollten &qout; mit " ersetzen auch Sie sollten metadata=... und die Verbindung sollte in einem solchen Format enthalten:

var cn = @"metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;" + 
     @"provider=System.Data.SqlClient;" + 
     @"provider connection string=""" + 
     @"data source=(localdb)\v11.0;" + 
     @"initial catalog=TestDB;" + 
     @"integrated security=True;" + 
     @"MultipleActiveResultSets=True;" + 
     @""""; 
var db = new TestDBEntities(cn); 

Hinweis: Es ist besser, die neue Überlast in einer Teilklasse zu setzen. Dann wird es nicht jedes Mal berührt, wenn .tt Vorlage des Kontexts ausgeführt wird.

+0

Ah ich sehe, ich habe die Metadaten aus der Zeichenfolge fehlt. Ich bin mir sicher, dass ich irgendwo hinkomme, da es mir jetzt sagt "Das Format des Initialisierungsstrings entspricht nicht der Spezifikation, die bei Index 159 beginnt.". Wenn Sie die Zeichenfolge in einem externen Viewer betrachten, ist Position 159 der Anfang von 'Anbieterverbindungszeichenfolge'. Ich werde weiter darauf eingehen und versuchen herauszufinden, warum dies geschieht. –

+0

Fügen Sie hier Ihre Verbindungszeichenfolge aus 'appconfig' ein. –

+0

Die vollständige Zeile aus der Konfigurationsdatei lautet wie folgt. Beachten Sie, dass ich den Benutzernamen und das Passwort durch generische Begriffe ersetzt habe, nur weil:: name = "KCAdminContext" connectionString = "metadata = res: //*/DataEntity.KCAdminEntities.csdl | res: //*/DataEntity.KCAdminEntities .ssdl | res: //*/DataEntity.KCAdminEntities.msl; provider = System.Data.SqlClient; Verbindungszeichenfolge des Providers = " Datenquelle = ALICE \ MSSQL2014; initialer Katalog = KCADMIN_TEST; Benutzer-ID = USER_NAME; Kennwort = PASSWORD; MultipleActiveResultSets = True; App = EntityFramework " "providerName =" System.Data.EntityClient " –

Verwandte Themen