8

No puedo hacer que las migraciones funcionen para un escenario específico.Migraciones de Entity Framework: compatibilidad con la cadena de conexión dinámica

Nuestra aplicación utiliza dos modelos diferentes. El primero es para la base de datos principal y allí, la migración funciona bien. El segundo modelo es para las bases de datos de nuestros clientes que son específicas para cada cliente (por supuesto ...) pero todas comparten el mismo modelo.

Por lo tanto, en la aplicación (ASP.Net MVC 3), identificamos al cliente que utiliza la ruta y todos los clientes están alojados en la misma aplicación. Entonces, para cada solicitud, pasamos una clave a nuestro constructor dbContext del modelo de cliente y con esa clave recuperamos la cadena de conexión a través de un simple método de ayuda.

La aplicación funciona bien, pero no las migraciones, ya que no encontré la forma de pasar la clave en la consola del Administrador de paquetes.

Intenté crear mi propia IDbConnectionFactory pero no se tiene en cuenta.

Si trato de un comando de actualización de base de datos con la fábrica de conexiones me sale el siguiente error que es normal, ya que ninguna tecla se pasa, pero puedo ver que mi fábrica de conexiones está lanzando en (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. 

Pero cuando trato de pasar en mi clave utilizando el parámetro -ConnectionString, entonces mi fábrica de conexiones se ignora y me sale el mismo error:

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. 

por lo tanto, es este un escenario sin apoyo en las migraciones o hay es otra forma de pasar en mi clave o tal vez hay otra forma de generar mis cadenas de conexión?

Gracias,

+0

Por lo tanto, soy yo para pierdo toda esperanza! ;-) – jjslagace

+0

¿Logró encontrar una solución? – Alireza

Respuesta

3

Usted debe ser capaz de pasar una llave de su fábrica de conexión personalizada con el parámetro -ConnectionStringName. Este parámetro se pasará al método CreateConnection.

Otra posible solución sería llamar a la migración DB de su código:

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

Gracias, ya probé con el parámetro -ConnectionStringName, pero tal vez debería intentarlo de nuevo con la versión 5. – jjslagace

+0

Nop, esto no funciona y el constructor de DbMigrator falla, quejándose de la falta del constructor predeterminado e IdbContextFactory <>. – Alireza

Cuestiones relacionadas