实体框架代码的动态连接字符串首先在运行时 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 服务器端

实体框架代码首先迁移两个不同的数据库

Visual Studio 2013 中带有 EF6 的 MySQL 连接器

有没有办法在 lambda 表达式树中使用“动态”?