将EF6与MySQL和SQL Server结合使用

时间:2018-06-23 09:15:23

标签: c# entity-framework-6

我有一个同时使用SQL Server和MySQL数据库的项目。我遵循this post将MySQL与EF6结合使用,并且运行良好。

然后,我又添加了一个连接到SQL Server的DbContextEfContext)。每当我在这种情况下执行任何命令时,都会引发异常:

  

未处理的异常:System.Data.Entity.Core.ProviderIncompatibleException:提供者未返回ProviderManifestToken字符串。

     

MySql.Data.MySqlClient.MySqlException:无法连接到任何指定的MySQL主机。

同样的问题,没有解决办法

http://stackoverflow.com/questions/23514648/using-mysql-mssql-for-two-different-databases-with-entity-framework

http://stackoverflow.com/questions/21838591/is-it-possible-to-have-a-ef-context-for-mysql-and-sqlserver

http://stackoverflow.com/questions/20308378/configure-multiple-database-entity-framework-6

我调试并发现MssqlDbContext的连接是MySql.Data.MySqlClient.MySqlConnection,无论我的提供者名称是System.Data.SqlClient是什么。看来MySqlEFConfiguration会覆盖所有配置。

我的问题还有其他解决办法吗?

[更新]

我分离了2个类库

  • SQL Server:仅引用EF和EF.SQL(EfContext)
  • Mysql:仅引用EF和MySql.Data.Entity(MySqlContext)

在演示项目中

app.config

<connectionStrings>
    <add name="EfContext" 
         connectionString="..." 
         providerName="System.Data.SqlClient" />
    <add name="MySqlContext" 
         connectionString="..." 
         providerName="MySql.Data.MySqlClient" />
</connectionStrings>

<entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <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" />
    </providers>
</entityFramework>

情况0:如果一次仅使用一个上下文,则效果很好

情况1:在MySqlContext之前使用EFContext

var ef = new EfContext("name=EfContext");
ef.Database.ExecuteSqlCommand("...");
var mysql = new MySqlContext("name=MySqlContext");

例外:

  

未处理的异常:System.TypeInitializationException:'MySql.Context.MySqlContext'的类型初始值设定项引发了异常。

     

System.InvalidOperationException:在发现“ MySqlEFConfiguration”类型之前,实体框架已使用默认的DbConfiguration实例。必须在使用任何Entity Framework功能之前在应用程序启动时设置“ MySqlEFConfiguration”的实例,或者必须在应用程序的配置文件中注册该实例。有关更多信息,请参见http://go.microsoft.com/fwlink/?LinkId=260883

情况2:在EfContext之前调用MySqlContext

var mysql = new MySqlContext("name=MySqlContext");
var ef = new EfContext("name=EfContext");
ef.Database.ExecuteSqlCommand("...");

例外:

  

未处理的异常:System.Data.Entity.Core.ProviderIncompatibleException:提供者未返回ProviderManifestToken字符串。

     

MySql.Data.MySqlClient.MySqlException:无法连接到任何指定的MySQL主机。 ---> System.AggregateException:发生一个或多个错误。 ---> System.Net.Sockets.SocketException:尚无此类主机

0 个答案:

没有答案