Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在同一项目(SQL Server和MySql)中对多个数据库和提供程序使用实体框架 背景:_C#_.net_Entity Framework_Entity Framework 6_Mysql Connector - Fatal编程技术网

C# 在同一项目(SQL Server和MySql)中对多个数据库和提供程序使用实体框架 背景:

C# 在同一项目(SQL Server和MySql)中对多个数据库和提供程序使用实体框架 背景:,c#,.net,entity-framework,entity-framework-6,mysql-connector,C#,.net,Entity Framework,Entity Framework 6,Mysql Connector,我有一个应用程序(web窗体和控制台),它可以轻松地首先使用实体框架代码访问多个SQL Server数据库,而不会出现任何问题。我可以在上下文之间来回切换,没有错误。现在我尝试添加一个新的MySql数据库(不同的提供程序),但是如果我从一个上下文切换到另一个上下文,我会得到以下错误消息: 错误: 实体框架使用了默认的DbConfiguration实例 在发现“MySqlEFConfiguration”类型之前。实例 在使用之前,必须在应用程序启动时设置“MySqlEFConfiguration”

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

错误: 实体框架使用了默认的DbConfiguration实例 在发现“MySqlEFConfiguration”类型之前。实例 在使用之前,必须在应用程序启动时设置“MySqlEFConfiguration” 任何实体框架功能都必须在中注册 应用程序的配置文件。看见 了解更多信息

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

Microsoft support文章似乎暗示要创建我自己的自定义DbConfiguration文件,但我已经有了一个:MySql.Data.Entity.mySqlEFConfiguration,我已经用它修饰了我的DbContext:

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

    }
 }
[DbConfigurationType(typeof(MySqlEFConfiguration))]
公共类MySqlDBContext:DbContext
{
公共MySqlDBContext():基(“MySqlDBContext”)
{
}
}
...
下面是我如何设置web.config的:


问题: 似乎没有任何方法可以使用配置文件配置来实现这一点,因为我仅限于一个条目。那么,在切换上下文时,如何指定提供者呢?我想在每个DbContext的构造函数中都缺少一些明确说明要使用哪个提供程序的内容?作为记录,我在控制台应用程序和web窗体应用程序中都收到了相同的错误消息

更新:其他信息
  • (8/21/19)如果我在SQLServer数据源上禁用MultipleActiveResultSets(MARS),它似乎可以正常工作,尽管这不是一个理想的解决方案,因为我编写的代码是为了利用MARS
  • (8/22/19)事实上,这并不能解决问题。它会直接进入下一个问题。每个应用程序只能有一个DbConfiguration,因此解决方案可能需要编写一个可与两个提供程序一起使用的DbConfiguration。。。我已随我的MSDN订阅提交了一个支持请求,以查看他们是否有任何其他见解

您可以使用分部类:

 public partial class MySqlDBContext : DbContext
    {
        public MySqlDBContext(string FirstSQLServerDBContext)
            : base(configmanager.connectionstrings(FirstSQLServerDBContext)...)
        {
        }

在微软的帮助下,我终于找到了答案。希望这能帮助其他人。我必须创建自己的类继承自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应用程序中,在应用程序启动时:

DbConfiguration.SetConfiguration(new MyCustomSQLDbConfiguration());

自定义DbConfiguration也适用于我。 或者,我已经看到它在不使用任何DbConfiguration属性的情况下成功地使用DbContext和DbConnection构造函数

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

谢谢。那还不够。。。我认为它需要在构造函数中重申要使用哪个提供程序,但我在Microsoft或其他任何地方的文档中都找不到任何此类指导…您没有尝试更改Context.cs,对吗?只是在同一名称空间中的不同类(如数据repo或facade)中,添加带有连接字符串的分部类和构造函数。我有multipleactiveresultsets=true。但我的providername是system.data.entityClient,因为我使用的是edmx。然后我得到以下信息:“MySqlDbContext类型的声明缺少部分修饰符”:此类型的另一个部分声明存在似乎您有两个DbContext类,对吗?如果是,那么如何在它们之间切换?如果没有,那么我想我无法获得您的解决方案,请您详细说明。您好,您可以添加链接以帮助理解您的解决方案吗?我进一步调查并检查了MySqlEFConfiguration类的反编译源。我强烈假设官方MySql.Data.EntityFramework.MySqlEFConfiguration类中存在导致此问题的某些配置。但是,如果您希望将mysql的所有功能与EF(迁移等)一起使用,则应像此类一样设置配置。您可以使用web.config(或app.config)文件和设置entityframework xml节点的codeConfigurationType来分离另一个项目的DbConfiguration。所以我使用官方配置类作为迁移项目的属性,但我使用我的自定义配置类作为主web项目的属性。它解释了如何在配置文件中设置配置。所以,如果您想同时使用多个上下文,您应该使用自定义dbconfiguration类型设置应用程序的配置,如下所示。