在同一项目中将 Entity Framework 与多个数据库和提供程序一起使用(SQL 服务器和 MySql)

Using Entity Framework with Multiple Databases and Providers in the Same Project (SQL Server and MySql)

背景:

我有一个应用程序(Web 表单和控制台)可以轻松访问多个 SQL 服务器数据库,首先使用 Entity Framework 代码没有问题。我可以在上下文之间来回切换而不会出现错误。现在我正在尝试添加一个新的 MySql 数据库(不同的提供者),但是如果我从一个上下文切换到另一个上下文,我会收到以下错误消息:

错误:

The default DbConfiguration instance was used by the Entity Framework before the 'MySqlEFConfiguration' type was discovered. An instance of 'MySqlEFConfiguration' must be set at application start before using any Entity Framework features or must be registered in the application's config file. See http://go.microsoft.com/fwlink/?LinkId=260883 for more information.

我看到的解决方案建议将 "codeConfigurationType" 属性添加到 web.config 中的 entityFramework 节点以指定我的 MySql 程序集,但这不会工作,因为我的目标是具有多个提供商的多个数据库。

Microsoft 支持文章似乎暗示创建我自己的自定义 DbConfiguration 文件,但我已经有一个:MySql.Data.Entity.mySqlEFConfiguration,并且我相应地用它装饰了我的 DbContext:

   [DbConfigurationType(typeof(MySqlEFConfiguration))]
    public class MySqlDBContext : DbContext
    {
        public MySqlDBContext() : base("MySqlDBContext")
        {

        }
    }
...

我的 web.config 设置如下:

  <entityFramework>
    <providers>
      <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6"/>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
  <connectionStrings>        
    <add name="FirstSQLServerDBContext" providerName="System.Data.SqlClient" connectionString="Server=SQLServerName;MultipleActiveResultSets=True; Database=FirstSQLDB; User ID=SQLUsername;Password=SqlPassword; Encrypt=true;" />
    <add name="SecondSQLServerDBContext" providerName="System.Data.SqlClient" connectionString="Server=SQLServerName;MultipleActiveResultSets=True; Database=SecondSQLDB; User ID=SQLUsername;Password=SqlPassword; Encrypt=true;" />
    <add name="MySqlDBContext" providerName="MySql.Data.MySqlClient" connectionString="server=MySqlServerName; port=3306;database=MySqlDB; uid=MySqlUsername; password=MySqlPassword;" />    
  </connectionStrings>

问题:

似乎没有任何方法可以使用配置文件配置来执行此操作,因为我仅限于一个条目。那么如何在切换上下文时指定提供者呢?我想我在每个 DbContext 的构造函数中都缺少一些东西来明确说明要使用哪个提供者?作为记录,我在控制台应用程序和 Web 表单应用程序中收到了相同的错误消息。

更新:附加信息

你可以使用部分 class:

 public partial class MySqlDBContext : DbContext
    {
        public MySqlDBContext(string FirstSQLServerDBContext)
            : base(configmanager.connectionstrings(FirstSQLServerDBContext)...)
        {
        }

在微软的帮助下,我终于弄明白了。希望这可以帮助其他人。我必须创建自己的 class 继承自 DbConfiguration

public class MyCustomSQLDbConfiguration : DbConfiguration
{
    public MyCustomSQLDbConfiguration()
    {
        SetExecutionStrategy("MySql.Data.MySqlClient", () => new MySqlExecutionStrategy());
        SetDefaultConnectionFactory(new LocalDbConnectionFactory("mssqllocaldb"));
    }
}

然后相应地装饰我的 MySqlDBContext:

[DbConfigurationType(typeof(MyCustomSQLDbConfiguration))]
public class MySqlDBContext : DbContext
{
    public MySqlDBContext() : base("MySqlDBContext")
    {

    }
 }

然后最后(也是重要的),在我 运行 应用程序时明确设置它。对于控制台应用程序,在 Program.Main 的开头,或者在 Web 应用程序中,在 Application_Start:

DbConfiguration.SetConfiguration(new MyCustomSQLDbConfiguration());

自定义 DbConfiguration 也对我有用。 或者,我已经看到它在不使用任何 DbConfiguration 属性的情况下使用 DbContext 和 DbConnection 构造函数成功运行。

using (var sqlConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["MssqlConnectionString"].ConnectionString))
using (var mssqlDbContext = new MSSQLDbContext(sqlConnection, true))
{
   //...
}

using (var mySqlConnection = new MySqlConnection(ConfigurationManager.ConnectionStrings["MysqlConnectionString"].ConnectionString))
using (var mySQLDbContext = new MySQLDbContext(mySqlConnection, true))
{
   //...
}

和system.data配置部分如下。

  <system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SqlServerCe.4.0" />
      <add name="Microsoft SQL Server Compact Data Provider 4.0" invariant="System.Data.SqlServerCe.4.0" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
      <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=8.0.24.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    </DbProviderFactories>
  </system.data>

我可以看到从两个数据上下文(MSSQL Compact 和 MySQL)检索到的结果。