为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
浮云间 2023-09-16 15:57:56
背景:我有一个应用程序(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 订阅提交了支持请求,看看他们是否有任何其他见解...
查看完整描述

3 回答

?
慕容森

TA贡献1853条经验 获得超18个赞

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


查看完整回答
反对 回复 2023-09-16
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

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


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)检索的结果。


查看完整回答
反对 回复 2023-09-16
?
青春有我

TA贡献1784条经验 获得超8个赞

您可以使用部分类:


 public partial class MySqlDBContext : DbContext

    {

        public MySqlDBContext(string FirstSQLServerDBContext)

            : base(configmanager.connectionstrings(FirstSQLServerDBContext)...)

        {

        }


查看完整回答
反对 回复 2023-09-16
  • 3 回答
  • 0 关注
  • 134 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信