8

Nie mogę sprawić, aby migracje działały dla określonego scenariusza.Entity Framework Migrations - obsługa dynamicznego ciągu połączenia

Nasza aplikacja wykorzystuje dwa różne modele. Pierwsza dotyczy głównej bazy danych, a migracja działa dobrze. Drugi model jest dla naszych klientów baz danych, które są specyficzne dla każdego klienta (oczywiście ...), ale wszystkie mają ten sam model.

Tak, we wniosku (ASP.Net MVC 3), możemy zidentyfikować klienta stosując drogę i wszyscy klienci są przechowywane w tej samej aplikacji. Tak więc, dla każdego żądania przekazujemy klucz do konstruktora dbContext naszego klienta, a za pomocą tego klucza odzyskujemy ciąg połączenia za pomocą prostej metody pomocniczej.

Aplikacja działa dobrze, ale nie migracje ponieważ nie znalazłem sposób przekazać klucz w konsoli Menedżer pakietów.

Starałem się stworzyć własną IDbConnectionFactory ale to nie jest brane pod uwagę.

Gdy próbuję polecenie update-bazy danych z fabryki połączeń otrzymuję następujący komunikat o błędzie, który jest normalne, gdyż żaden klawisz nie jest przekazywana, ale widzę, że moja fabryka połączeń jest kopanie w (EFCustomerModel.EFConnectionFactory):

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. 

Ale gdy próbuję przekazać w moim kluczem przy użyciu parametru -ConnectionString, to moja fabryka połączeń jest ignorowany i uzyskać ten sam błąd:

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. 

Tak, to jest nieobsługiwany scenariusz migracji lub nie to inny sposób na przekazanie mojego klucz, czy może istnieje inny sposób generowania ciągów połączeń?

Dzięki,

+0

Tak, mam tracić nadziei! ;-) – jjslagace

+0

Udało ci się znaleźć rozwiązanie? – Alireza

Odpowiedz

3

Powinieneś być w stanie przekazać klucz do fabryki niestandardowe połączenie z parametrem -ConnectionStringName. Ten parametr zostanie przekazany do metody CreateConnection.

Innym możliwym rozwiązaniem byłoby zadzwonić do migracji DB z kodu:

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

Dzięki, ja już próbowałem z parametrem -ConnectionStringName ale może powinienem spróbować jeszcze raz z wersji 5. – jjslagace

+0

NOP, to nie działa i konstruktor DbMigrator zawiedzie, skarży się na brak domyślnego konstruktora i IdbContextFactory <>. – Alireza

Powiązane problemy