我有一个同时使用SQL Server和MySQL数据库的项目。我遵循this post将MySQL与EF6结合使用,并且运行良好。
然后,我又添加了一个连接到SQL Server的DbContext
(EfContext
)。每当我在这种情况下执行任何命令时,都会引发异常:
未处理的异常:System.Data.Entity.Core.ProviderIncompatibleException:提供者未返回ProviderManifestToken字符串。
MySql.Data.MySqlClient.MySqlException:无法连接到任何指定的MySQL主机。
同样的问题,没有解决办法
http://stackoverflow.com/questions/20308378/configure-multiple-database-entity-framework-6
我调试并发现MssqlDbContext
的连接是MySql.Data.MySqlClient.MySqlConnection
,无论我的提供者名称是System.Data.SqlClient
是什么。看来MySqlEFConfiguration
会覆盖所有配置。
我的问题还有其他解决办法吗?
[更新]
我分离了2个类库
在演示项目中
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:尚无此类主机