2016-07-19 4 views
0

Я работаю над проектом ASP.net MVC с использованием EF в сочетании с MySql. Теперь это работает отлично, но я также хочу ссылаться на другую библиотеку классов, которая использует EF с SQL.Использование EF DbContext с mysql и sql в одном проекте

Когда я ссылаюсь на библиотеку, EF, похоже, путается с тем, какой провайдер должен использовать для каждого DbContext.

На мой MySql DbContext У меня есть следующий атрибут для того, чтобы сказать EF это DbContext должен быть обработан провайдером MySql:

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

Теперь на SQL DbContext, у меня нет атрибута. Должен ли я разместить его там, и если да, то какой? Я сделал несколько поисков по этому вопросу, но не смог найти правильный ответ нигде.

В настоящее время я получаю следующее сообщение об ошибке:

The default DbConfiguration instance was used by the Entity Framework before the 'MySqlEFConfiguration' type was discovered. An instance of 'MySqlEFConfiguration' must be set at application start before using any Entity Framework features or must be registered in the application's config file.

Это довольно прямо вперед, поскольку контекст SQL используется перед MySql один, но я не могу найти исправление по этому вопросу.

Таким образом, вопрос заключается в том, что было бы «Лучшей практикой» при обработке этого? Или это то, чего я должен избегать, объединяя 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> 

Я вижу, о n DbProviderFactories это единственное высказывание Mysql.

+0

прекрасно использовать несколько DbContext. Можете ли вы опубликовать свой web.config? –

+0

Это может вам помочь: http://stackoverflow.com/questions/24766068/entityframework-two-different-providers-on-the-same-config-file –

+0

У меня нет среды для проверки в руке. Попробуйте поместить это поверх вашего SqlContext: '[DbConfigurationType (typeof (System.Data.Entity.DbConfiguration))] –

ответ

0

Не важно, сколько у вас DbContexts (в рамках сущности 6). Просто введите строки подключения в appConfig или webConfig проекта запуска.

Пример AppConfig с двумя ConnectionString с Ef 6,01 & Sql сервера и 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.... 
} 
+0

См. Мое редактирование.У меня есть 2 строки подключения в файле web.config и оба поставщика. Когда я его изменяю, SqlCeProvider Sql также не работает сам по себе. Сервер Sql также не является сервером SqlCompact. –

+0

Я отредактировал мой ответ, попробуйте еще раз –

+0

Выключает удаление атрибута MySql. Не могу поверить, что я не пробовал это раньше. Спасибо! Fyi с System.Data.SqlServerCe.4.0 не работает, поскольку мы не используем компактный. –