entity-framework - Entity Framework 迁移-支持动态连接字符串

标签 entity-framework entity-framework-4.3 package-managers entity-framework-migrations

我无法在特定情况下进行迁移。
我们的应用程序使用两种不同的模型。第一个用于主数据库,并且在那里迁移正常。第二种模型适用于我们的客户数据库,这些数据库特定于每个客户(当然...),但都共享相同的模型。
因此,在应用程序(ASP.Net MVC 3)中,我们使用路由识别客户,并且所有客户都托管在同一应用程序中。因此,对于每个请求,我们将一个 key 传递给我们的客户模型dbContext构造函数,并使用该 key 通过一个简单的辅助方法来恢复连接字符串。
该应用程序运行正常,但迁移却不正常,因为我找不到在Package Manager控制台中传递 key 的方法。
我尝试创建自己的IDbConnectionFactory,但未将其考虑在内。
如果我在连接工厂中尝试使用update-database命令,则会收到以下错误,这是正常现象,因为未传递任何 key ,但我可以看到我的连接工厂正在启动(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.
但是,当我尝试使用-Co​​nnectionString参数传递 key 时,我的连接工厂将被忽略,并且会出现相同的错误:
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.
那么,这是迁移中不受支持的方案,还是通过另一种方式传递我的 key ,或者还有另一种方式来生成我的连接字符串?

最佳答案

您应该能够使用-ConnectionStringName参数将 key 传递给自定义连接工厂。该参数将传递给CreateConnection方法。

另一种可能的解决方案是从您的代码中调用数据库迁移:

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();

关于entity-framework - Entity Framework 迁移-支持动态连接字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12079068/

相关文章:

c# - Entity Framework 更新操作 - 为什么首先更新子记录?

php - Composer 安装 pear 包

package - Julia:如何更新到最新版本的软件包(即 Flux)

python - 如何创建一个包来安装 python 脚本需要的所有依赖项

c# - LINQ - 重构。包含对 IEnumerable<string> 的比较以区分大小写

entity-framework - 延迟加载异常( Entity Framework )

entity-framework-migrations - EF 4.3.1 - 代码优先自动迁移 - 如何指定列宽

.net - Entity Framework 4.3在应用程序启动时运行迁移

c# - SQL Server 到 Entity Framework 数据类型的映射

ef-code-first - 我在人际关系上做错了什么?两个依赖实体引用的公共(public)实体