实体框架代码的动态连接字符串首先在运行时 EF6(mssql、mysql、oracle)中用于多个数据库提供程序
Posted
技术标签:
【中文标题】实体框架代码的动态连接字符串首先在运行时 EF6(mssql、mysql、oracle)中用于多个数据库提供程序【英文标题】:Dynamic connection string for entity framework code first for multiple database providers at runtime EF6 ( mssql, mysql, oracle ) 【发布时间】:2017-10-15 02:09:50 【问题描述】:我正在尝试使用实体框架代码优先模型通过动态生成连接字符串来连接多个数据库提供程序。但它没有按预期工作。
这是要查看的代码:
switch (providerName)
case "System.Data.SqlClient":
entityBuilder = new EntityConnectionStringBuilder();
entityBuilder.Provider = providerName;
//ConfigurationManager.ConnectionStrings["mssql"].ConnectionString
break;
case "mysql.Data.MySqlClient":
entityBuilder = new EntityConnectionStringBuilder();
entityBuilder.Provider = providerName;
//ConfigurationManager.ConnectionStrings["mysql"].ConnectionString
break;
default:
break;
switch (providerName)
case "System.Data.SqlClient":
conn = new SqlConnectionStringBuilder(entityBuilder.ProviderConnectionString)
UserID = databaseUserId,
Password = databasePassword,
DataSource = serverName,
IntegratedSecurity = false,
InitialCatalog = databaseName
.ConnectionString;
break;
case "MySql.Data.MySqlClient":
conn = new MySql.Data.MySqlClient.MySqlConnectionStringBuilder(entityBuilder.ProviderConnectionString)
Server = serverName,
UserID = databaseUserId,
Password = databasePassword,
Database = databaseName,
PersistSecurityInfo = true
.ConnectionString;
break;
default:
break;
网页配置
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="mssqllocaldb" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
<provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"></provider></providers>
</entityFramework>
<DbProviderFactories>
<remove invariant="MySql.Data.MySqlClient" />
<add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
</DbProviderFactories>
DbContext 构造函数
` public partial class ModelCodeFist : DbContext
public ModelCodeFist(string connection)
: base(connection)
`
我如何在运行时更改默认提供程序,因为 EF 将 sql 连接器作为 defaultConnectionFactory
动态连接到 mssql 正在工作,但是对于 mysql 它正在生成错误,因为 默认连接器仍然是 sqlclient,请查看下图:
如果我错过了什么,请告诉我 谢谢!
【问题讨论】:
【参考方案1】:您想创建自己的 ProviderFactory 实现 IDbConnectionFactory
public class MyProviderFactory : IDbConnectionFactory
public DbConnection CreateConnection(string nameOrConnectionString)
if ("mySqlName".equals(nameOrConnectionString))
return new MySqlConnection("<Connection String>");
else
return new SqlConnection("<Connection String>");
然后在您的 app.config 中将其设置为 DefaultConnectionFactory
<defaultConnectionFactory type="MyAssmebly.MyProviderFactory, MyAssmebly">
<parameters>
未经测试的代码,当然未经性能测试!
【讨论】:
以上是关于实体框架代码的动态连接字符串首先在运行时 EF6(mssql、mysql、oracle)中用于多个数据库提供程序的主要内容,如果未能解决你的问题,请参考以下文章
如何将实体框架(代码优先)与动态创建的连接字符串和单文件数据库一起使用?
首先通过将类型作为参数传递来动态实例化实体框架数据库中的模型对象
.net Core 的实体框架 6。在 Blazor 服务器端