Настройка нескольких баз данных 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 в одном решении?
Ответы
Ответ 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";