在同一个项目中使用EF DbContext和mysql和sql

时间:2016-07-19 07:41:43

标签: c# mysql asp.net-mvc entity-framework dbcontext

我正在使用EF与MySql结合使用ASP.net MVC项目。现在这本身就可以了,但我也想引用另一个使用EF和SQL的类库。

当我引用库时,EF似乎对每个DbContext使用的提供程序感到困惑。

在我的MySql DbContext上我有以下属性以告诉EF这个DbContext应该由MySql提供者处理:

[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]

现在在SQL DbContext上,我没有属性。我应该把一个放在那里,如果是这样的话?我对此事进行了一些搜索,但无法在任何地方找到正确答案。

目前,我收到以下错误:

  

实体框架使用默认的DbConfiguration实例   在' MySqlEFConfiguration'之前类型被发现。一个例子   ' MySqlEFConfiguration'必须在使用前在应用程序启动时设置   任何实体框架功能或必须在   应用程序的配置文件。

这很简单,因为在MySql之前使用了SQL上下文,但我似乎无法找到解决方法。

所以问题是什么是最佳实践'处理这个?或者这是我应该避免的,在同一个项目中组合2个DbContexts。

先谢谢!

MySql DbContext

[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
public class MySqlContext : DbContext
{
    public MySqlContext() : base("name=MySqlContext")
    {
        this.Configuration.LazyLoadingEnabled = false;
    }
    //DbSets....
}

SQL DbContext

public class SqlContext : DbContext
{
    public SqlContext() : base("name=SqlContext")
    {
        Configuration.LazyLoadingEnabled = false;
    }
    //DbSets....
}

的Web.config:

    <connectionStrings>
    <add name="SqlContext" connectionString="some connectionString" providerName="System.Data.SqlClient" />
    <add name="MysqlContext" connectionString="some connectionString" providerName="MySql.Data.MySqlClient" />
  </connectionStrings>

<entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <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, Version=6.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"></provider>
    </providers>
  </entityFramework>
  <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701" />
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
    </compilers>
  </system.codedom>
  <system.data>
    <DbProviderFactories>
      <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=6.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    </DbProviderFactories>
  </system.data>

我在DbProviderFactories上看到它唯一的说法是Mysql。

1 个答案:

答案 0 :(得分:0)

你有多少DbContexts并不重要(在实体框架6中)。只需将连接字符串放在启动项目的appConfig或webConfig中即可。

appConfig的示例,其中两个connectionString与Ef 6.01&amp; Sql Server和My SQL

<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<connectionStrings>
    <add name="MySqlDB" connectionString="Your My SQL ConnectionString"  providerName="My Sql Provider" />
    <add name="SqlDB" connectionString="Your SQL ConnectionString"  providerName="Sql Provider" />
</connectionStrings>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlCeConnectionFactory, EntityFramework">
  <parameters>
    <parameter value="System.Data.SqlServerCe.4.0" />
  </parameters>
</defaultConnectionFactory>
<providers>
   <provider invariantName="System.Data.SqlServerCe.4.0" type="System.Data.Entity.SqlServerCompact.SqlCeProviderServices, EntityFramework.SqlServerCompact" />
</providers>
</entityFramework>

MySql DbContext

public class MySqlContext : DbContext
{
   public MySqlContext() : base("MySqlDB")
   {
      this.Configuration.LazyLoadingEnabled = false;
   }
//DbSets....
}

SQL DbContext

public class SqlContext : DbContext
{
   public SqlContext() : base("SqlDB")
   {
      Configuration.LazyLoadingEnabled = false;
   }
   //DbSets....
}