Подтвердить что ты не робот

Настройка нескольких баз данных Entity Framework 6

В моем решении у меня есть 2 проекта, которые используют Entity Framework 6. Каждая точка указывает на другую базу данных, причем обе эти данные предоставляют SQL Server. Третий проект в моем решении должен использовать обе базы данных. Моя проблема заключается в том, как настроить этот контекст. Я попытался создать класс конфигурации в отдельной сборке:

namespace OSAD_Base
{
    class EfDbConfiguration : DbConfiguration
    {
        public EfDbConfiguration()
        {
            SetProviderServices(SqlProviderServices.ProviderInvariantName, SqlProviderServices.Instance);
        }
    }
}

и ссылаясь на эту конфигурацию в каждом классе контекста:

namespace IntegrationDb
{
    [DbConfigurationType("OSAD_Base.EfDbConfiguration, OSAD_Base")]
    public partial class IntegrationEntities : DbContext
    {
        public IntegrationEntities(string connectionString)
            : base(connectionString)
        {
        }
    }
}

При инициализации моего первого, все работает правильно, но когда второй контекст инициализируется (порядок не имеет значения), я получаю и ошибку:

Был установлен экземпляр "EfDbConfiguration", но этот тип не был обнаружен в той же сборке, что и контекст "B1Entities". Либо введите тип DbConfiguration в ту же сборку, что и тип DbContext, используйте DbConfigurationTypeAttribute в типе DbContext, чтобы указать тип DbConfiguration, или задайте тип DbConfiguration в файле конфигурации. Подробнее см. http://go.microsoft.com/fwlink/?LinkId=260883. *

Я также попытался создать раздел entityframework в моем app.config(проекта запуска), но получил следующую ошибку:

Не удалось инициализировать конфигурационную систему

Нераспознанный раздел конфигурации entityFramework

Как я могу использовать 2 отдельных проекта EF в одном решении?

4b9b3361

Ответ 1

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

Затем вы готовы к работе.

Пример appConfig с двумя connectionString с Ef 6.01 и Sql Compact 4.0

<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="MainDb" connectionString="Data Source=|DataDirectory|\Db.sdf" providerName="System.Data.SqlServerCe.4.0" />
    <add name="AnotherDb" connectionString="Data Source=|DataDirectory|\AnotherDb.sdf" providerName="System.Data.SqlServerCe.4.0" />
  </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>

И пример DbContexts:

public class AppDb : DbContext
{
    public AppDb()
        : base("MainDb")
    {

    }
}

public class AnotherDb : DbContext
{
    public AnotherDb()
        : base("AnotherDb")
    {

    }
}

Не важно, что ваши контексты находятся в отдельных проектах или нет, важна только конфигурация проекта запуска.

Сообщите мне, нужна ли какая-либо другая информация.

Удачи.

Ответ 2

Несмотря на то, что вопрос старый, я был отправлен здесь google, но не нашел ответа. Может быть, мой ответ поможет кому-то.

Строка подключения EntityFramework 6 должна находиться внутри файла конфигурации, который находится (предупреждение!) в папке исполнения. Например, OP имеет несколько проектов в решении, поэтому строка подключения должна быть в файле конфигурации принадлежит основному исполнительному проекту.

Теперь, если вы хотите определить строку подключения в своем коде, вы можете сделать фальшивую строку подключения в файле конфигурации и предоставить вашему экземпляру экземпляр новую строку подключения:

DBEntities e = new DBEntities();
e.Database.Connection.ConnectionString = "Data Source=MyServ;Initial Catalog=MyDB;Persist Security Info=True;User ID=sa;Password=***;Application Name=MyApp";