使用 Entity Framework 对两个不同的数据库使用 MySQL 和 MSSQL

Posted

技术标签:

【中文标题】使用 Entity Framework 对两个不同的数据库使用 MySQL 和 MSSQL【英文标题】:Using MySQL & MSSQL for two different databases with Entity Framework 【发布时间】:2014-06-24 05:51:53 【问题描述】:

我正在尝试构建一个 Web api,它提供来自 mysql 数据库或 MSSQL 数据库的数据(完全不同的数据和架构)。它还为在两者之间移动数据提供了一些端点。我创建了两个类库来保存两个数据库的 EF 模型,并且成功地连接到两个实例并针对这两个实例运行查询。它失败的地方是试图访问它们。我必须调整 web.config entityFramework 部分才能使其正常工作,但我无法让它同时有效地工作。我正在使用 EF6 和最新的 MySQL 连接器。

这是 MSSQL 实体的工作配置:

<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
  <parameters>
    <parameter value="v11.0" />
  </parameters>
</defaultConnectionFactory>
<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>

这是我尝试使用 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.

这是 MySQL 实体的工作配置:

<entityFramework codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6">
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, 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" />  

这然后抱怨连接字符串,因为它试图使用 MySQL 库。我在网上找不到太多关于这个的问题,这里的问题很相似,但没有答案:Is it possible to have a EF Context for MySql and SqlServer?

有没有人这样做或知道解决这个问题的方法?

【问题讨论】:

EF 6.X 解决方案***.com/questions/26361592/… 我使用实体框架 6 工作,请参阅 [在实体框架 6 中使用 MySQL 和 MSSQL][1] [1]:***.com/questions/31280119/… 我使用 Entity Framework 6 使其工作,请参阅 [在 Entity Framework 6 中使用 MySQL 和 MSSQL][1] [1]:***.com/questions/31280119/… 【参考方案1】:

我在 SO 和其他地方找到了所有可以找到的解决方案,对我来说,问题原来是我的 MSSQL 连接字符串。

之前:

<add name="DefaultConnection" providerName="System.Data.SqlClient" connectionString="Server=serverName/instance;Database=PublicWebsite;Integrated Security=True;" />

之后:

<add name="DefaultConnection" providerName="System.Data.SqlClient" connectionString="Data Source=serverName/instance;Initial Catalog=PublicWebsite;Integrated Security=True;" />

“之前”连接字符串适用于 EF。在我们为 EF 引入 MySQL 之后出现的问题(在不同的类库中)。

需要明确的是,在 MSSQL 中,连接字符串我们只是将“服务器”更改为“数据源”,并将“数据库”更改为“初始目录”。

【讨论】:

【参考方案2】:

我有同样的问题。我在我的代码优先项目中使用迁移,其中包含 mysql 和 mssql 的两个数据库上下文。问题是因为 EF6 尝试在配置文件或 db 上下文所在的同一程序集中查找 db 配置。对于 mysql 迁移,我使用继承自 DbContext 的 MySqlHistoryContext。在 db 初始化阶段 EF6 创建 MySqlHistoryContext 的实例并找到 MySqlEFConfiguration 类型并尝试使用它。 我找到了两种解决问题的方法。第一个是通过使用 null 参数调用 Database.SetInitializer 来禁用迁移检查。第二个是从我自己的程序集中的 MySqlHistoryContext 继承。第二个似乎对我有用。

【讨论】:

【参考方案3】:

在撰写本文时,测试版 MySQL 连接器 6.9.1 版似乎已经解决了这个问题。我现在两个并排运行,没有任何问题。

更新

为了澄清,我的设置是 EF5(EF6 不起作用)和 MySQL 连接器版本 6.9.1(测试版)。我的 web.config 部分如下所示:

<entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
  </entityFramework>

模型位于同一个项目中,我再次遇到了类库问题。

【讨论】:

我试图让 SQLCE 和 Mysql 在同一个解决方案上工作......使用实体框架和迁移......但我不明白你是如何让它运行的。你做了 2 个配置文件? @Daniloko 我已经更新了答案,希望这将为您提供所需的内容。【参考方案4】:

为了解决这个错误,我把它放在我的 App.config 中:"codeConfigurationType"

<entityFramework codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6">

为什么?可能配置没有找到 MySqlEFConfiguration 的位置。

我在这里只使用 Mysql我不知道这是否适用于 SQLServer 和 Mysql togueter。

对于您的问题,此链接可能很有用:Link

你可以有 2 个单独的 configuration.cs 文件。一个用于 MySql,另一个用于 MSSQL

【讨论】:

我把这里只用于mysql,因为它对像我这样的用户有用..只使用mysql,请把这个问题的解决方法的更新(“使用2个数据库类型”)放在后面。 感谢您的意见,您是对的,这在单独使用 EF6 和 MySQL 时确实有帮助,但不能解决我的问题。

以上是关于使用 Entity Framework 对两个不同的数据库使用 MySQL 和 MSSQL的主要内容,如果未能解决你的问题,请参考以下文章

Oracle Entity Framework - 从不同模式的表中生成实体

.Net Framework 4.5.2 和 Entity Framework 6 中的两种不同的数据库访问

配置多数据库Entity Framework 6

如何在dotnet core Entity Framework中对多个表的数据进行GroupBy操作?

Entity Framework 4.1 两个跟踪查询

Entity Framework 6 Code First +MVC5+MySql/Oracle使用过程中的两个问题