猿问

在同一项目中使用具有多个数据库和提供程序的实体框架(SQL Server 和 MySql)

背景:

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

错误:

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

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

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

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

        }
    }
...


问题:

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

更新:附加信息

  • (8/21/19) 如果我在 SQLServer 数据源上禁用 MultipleActiveResultSets (MARS),似乎可以正常工作,但这不是一个理想的解决方案,因为我已经编写了代码来利用 MARS。

  • (8/22/19) 实际上这并不能解决问题。它只会继续下一个问题。每个应用程序只能有一个 DbConfiguration,因此解决方案可能涉及编写一个与两个提供商一起使用的 DbConfiguration...我已通过我的 MSDN 订阅提交了支持请求,看看他们是否有任何其他见解...


浮云间
浏览 148回答 3
3回答

慕容森

在微软的帮助下,我终于弄清楚了。希望这对其他人有帮助。我必须创建自己的类继承自 DbConfigurationpublic 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());

MMMHUHU

自定义 DbConfiguration 也对我有用。或者,我看到它使用 DbContext 和 DbConnection 构造函数成功运行,而不使用任何 DbConfiguration 属性。using (var sqlConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["MssqlConnectionString"].ConnectionString))using (var mssqlDbContext = new MSSQLDbContext(sqlConnection, true)){&nbsp; &nbsp;//...}using (var mySqlConnection = new MySqlConnection(ConfigurationManager.ConnectionStrings["MysqlConnectionString"].ConnectionString))using (var mySQLDbContext = new MySQLDbContext(mySqlConnection, true)){&nbsp; &nbsp;//...}配置中的system.data部分如下。&nbsp; <system.data>&nbsp; &nbsp; <DbProviderFactories>&nbsp; &nbsp; &nbsp; <remove invariant="System.Data.SqlServerCe.4.0" />&nbsp; &nbsp; &nbsp; <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" />&nbsp; &nbsp; &nbsp; <remove invariant="MySql.Data.MySqlClient" />&nbsp; &nbsp; &nbsp; <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=8.0.24.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />&nbsp; &nbsp; </DbProviderFactories>&nbsp; </system.data>我可以看到从两个数据上下文(MSSQL Compact 和 MySQL)检索的结果。

青春有我

您可以使用部分类:&nbsp;public partial class MySqlDBContext : DbContext&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; public MySqlDBContext(string FirstSQLServerDBContext)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : base(configmanager.connectionstrings(FirstSQLServerDBContext)...)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; }
随时随地看视频慕课网APP
我要回答