8

Ich kann die Migrationen für ein bestimmtes Szenario nicht ausführen.Entity Framework Migrationen - Unterstützung für dynamische Verbindungszeichenfolge

Unsere Anwendung verwendet zwei verschiedene Modelle. Der erste ist für die Hauptdatenbank und dort funktioniert die Migration gut. Das zweite Modell ist für unsere Kundendatenbanken, die für jeden Kunden spezifisch sind (natürlich ...), aber alle haben das gleiche Modell.

Also, in der Anwendung (ASP.Net MVC 3), identifizieren wir den Kunden mit der Route und alle Kunden sind in der gleichen Anwendung gehostet. Also übergeben wir für jede Anfrage einen Schlüssel an unser Kundenmodell dbContext constructor, und mit diesem Schlüssel stellen wir die Verbindungszeichenfolge über eine einfache Hilfsmethode wieder her.

Die Anwendung funktioniert gut, aber nicht die Migrationen seit ich keine Möglichkeit gefunden habe, den Schlüssel in der Package Manager Console übergeben.

Ich habe versucht, meine eigene IDbConnectionFactory zu erstellen, aber es wird nicht berücksichtigt.

Wenn ich versuchen, ein Update-Datenbank-Befehl mit der Verbindungsfactory ich folgende Fehlermeldung erhalten, was normal ist, da kein Schlüssel übergeben wird, aber ich kann sehen, dass meine Verbindung Fabrik befindet sich in (EFCustomerModel.EFConnectionFactory) treten:

PM> update-database -verbose 
Using NuGet project 'EFCustomerModel'. 
Using StartUp project 'PMEL.DatabaseSetup'. 
System.ArgumentException: Format of the initialization string does not conform to specification starting at index 0. 
    at System.Data.Common.DbConnectionOptions.GetKeyValuePair(String connectionString, Int32 currentPosition, StringBuilder buffer, Boolean useOdbcRules, String& keyname, String& keyvalue) 
    at System.Data.Common.DbConnectionOptions.ParseInternal(Hashtable parsetable, String connectionString, Boolean buildChain, Hashtable synonyms, Boolean firstKey) 
    at System.Data.Common.DbConnectionOptions..ctor(String connectionString, Hashtable synonyms, Boolean useOdbcRules) 
    at System.Data.SqlClient.SqlConnectionString..ctor(String connectionString) 
    at System.Data.SqlClient.SqlConnectionFactory.CreateConnectionOptions(String connectionString, DbConnectionOptions previous) 
    at System.Data.ProviderBase.DbConnectionFactory.GetConnectionPoolGroup(String connectionString, DbConnectionPoolGroupOptions poolOptions, DbConnectionOptions& userConnectionOptions) 
    at System.Data.SqlClient.SqlConnection.ConnectionString_Set(String value) 
    at System.Data.SqlClient.SqlConnection.set_ConnectionString(String value) 
    at System.Data.SqlClient.SqlConnection..ctor(String connectionString) 
    **at EFCustomerModel.EFConnectionFactory.CreateConnection(String nameOrConnectionString) in C:\...\EFCustomerModel\EFConnectionFactory.vb:line 18** 
    at System.Data.Entity.Internal.LazyInternalConnection.Initialize() 
    at System.Data.Entity.Internal.LazyInternalConnection.get_Connection() 
    at System.Data.Entity.Internal.LazyInternalContext.get_Connection() 
    at System.Data.Entity.Infrastructure.DbContextInfo..ctor(Type contextType, DbProviderInfo modelProviderInfo, AppConfig config, DbConnectionInfo connectionInfo) 
    at System.Data.Entity.Infrastructure.DbContextInfo..ctor(Type contextType) 
    at System.Data.Entity.Migrations.DbMigrator..ctor(DbMigrationsConfiguration configuration, DbContext usersContext) 
    at System.Data.Entity.Migrations.DbMigrator..ctor(DbMigrationsConfiguration configuration) 
    at System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.GetMigrator() 
    at System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.RunCore() 
    at System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.Run() 
Format of the initialization string does not conform to specification starting at index 0. 

Aber wenn ich versuche, in meinem Schlüssel zu übergeben Sie den -ConnectionString Parameter verwendet wird, dann wird meine Verbindung Fabrik ignoriert und ich bekomme die gleichen Fehler:

PM> update-database -verbose -ConnectionString:CC99999 -ConnectionProviderName:System.Data.SqlClient 
Using NuGet project 'EFCustomerModel'. 
Using StartUp project 'PMEL.DatabaseSetup'. 
System.ArgumentException: Format of the initialization string does not conform to specification starting at index 0. 
    at System.Data.Common.DbConnectionOptions.GetKeyValuePair(String connectionString, Int32 currentPosition, StringBuilder buffer, Boolean useOdbcRules, String& keyname, String& keyvalue) 
    at System.Data.Common.DbConnectionOptions.ParseInternal(Hashtable parsetable, String connectionString, Boolean buildChain, Hashtable synonyms, Boolean firstKey) 
    at System.Data.Common.DbConnectionOptions..ctor(String connectionString, Hashtable synonyms, Boolean useOdbcRules) 
    at System.Data.SqlClient.SqlConnectionString..ctor(String connectionString) 
    at System.Data.SqlClient.SqlConnectionFactory.CreateConnectionOptions(String connectionString, DbConnectionOptions previous) 
    at System.Data.ProviderBase.DbConnectionFactory.GetConnectionPoolGroup(String connectionString, DbConnectionPoolGroupOptions poolOptions, DbConnectionOptions& userConnectionOptions) 
    at System.Data.SqlClient.SqlConnection.ConnectionString_Set(String value) 
    at System.Data.SqlClient.SqlConnection.set_ConnectionString(String value) 
    at System.Data.Entity.Internal.LazyInternalConnection.InitializeFromConnectionStringSetting(ConnectionStringSettings appConfigConnection) 
    at System.Data.Entity.Internal.LazyInternalConnection.Initialize() 
    at System.Data.Entity.Internal.LazyInternalConnection.get_Connection() 
    at System.Data.Entity.Internal.LazyInternalContext.get_Connection() 
    at System.Data.Entity.Infrastructure.DbContextInfo..ctor(Type contextType, DbProviderInfo modelProviderInfo, AppConfig config, DbConnectionInfo connectionInfo) 
    at System.Data.Entity.Infrastructure.DbContextInfo..ctor(Type contextType, DbConnectionInfo connectionInfo) 
    at System.Data.Entity.Migrations.DbMigrator..ctor(DbMigrationsConfiguration configuration, DbContext usersContext) 
    at System.Data.Entity.Migrations.DbMigrator..ctor(DbMigrationsConfiguration configuration) 
    at System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.GetMigrator() 
    at System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.RunCore() 
    at System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.Run() 
Format of the initialization string does not conform to specification starting at index 0. 

Also, das ist ein nicht unterstütztes Szenario in den Migrationen oder dort ist ein anderer Weg, um meine Schlüssel oder vielleicht gibt es eine andere Möglichkeit, meine Verbindungszeichenfolgen zu generieren?

Danke,

+0

Also, bin ich jede Hoffnung zu verlieren! ;-) – jjslagace

+0

Haben Sie es geschafft, eine Lösung zu finden? – Alireza

Antwort

3

Sie sollten einen Schlüssel zu Ihrem eigenen Verbindungs ​​Werk mit dem -ConnectionStringName Parameter zu übergeben können. Dieser Parameter würde an die Methode CreateConnection übergeben.

Eine andere mögliche Lösung wäre DB Migration aus dem Code zu nennen:

var configuration = new Configuration(); 
configuration.TargetDatabase = new DbConnectionInfo(
    "Server=MyServer;Database=MyDatabase;Trusted_Connection=True;", 
    "System.Data.SqlClient"); 

var migrator = new DbMigrator(configuration); 
migrator.Update(); 
+0

Danke, ich habe es bereits mit dem Parameter -ConnectionStringName versucht, aber vielleicht sollte ich das nochmal mit Version 5 versuchen. – jjslagace

+0

Nop, das funktioniert nicht und der DbMigrator-Konstruktor schlägt fehl und beschwert sich über das Fehlen des Standardkonstruktors und IdbContextFactory <>. – Alireza