Обновление: Проблема решена, см. конец этого вопроса.
Проблема:
Мы пытаемся использовать Entity Framework 6 и конфигурацию на основе кода в сценарии: мы использовали SQL Server и SQL Server CE в том же AppDomain
.
Этот довольно простой сценарий, похоже, не поддерживается "по дизайну". От команды EF:
Примечание. Мы не поддерживаем наличие нескольких классов конфигурации, используемых в тот же AppDomain. Если вы используете этот атрибут для установки разных классов конфигурации для двух контекстов, будет выбрано исключение.
Дополнительная информация здесь: Конфигурация на основе кода (Codeplex)
Вопрос:
Как нам двигаться дальше? Любая помощь будет принята с благодарностью! Существует ли более гибкий способ подключения конфигурации к контексту вместо AppDomain
?
(Наши классы контекста расположены в разных сборках. Мы попробовали атрибут DbConfigurationType
, но проблема в самом EF)
Конфигурационные файлы:
Конфигурация для обычного SQL-сервера
public class EfConfiguration : DbConfiguration
{
public EfConfiguration()
{
SetProviderServices(
SqlProviderServices.ProviderInvariantName,
SqlProviderServices.Instance);
SetDefaultConnectionFactory(new SqlConnectionFactory());
}
}
Конфигурация для SQL Server Compact Edition
public class EfCeConfiguration : DbConfiguration
{
public EfCeConfiguration()
{
SetProviderServices(
SqlCeProviderServices.ProviderInvariantName,
SqlCeProviderServices.Instance);
SetDefaultConnectionFactory(
new SqlCeConnectionFactory(SqlCeProviderServices.ProviderInvariantName));
}
}
UPDATE:
Ошибка, которую мы получаем:
System.TypeInitializationException: инициализатор типа для 'MyProject.Repositories.Base.DataContext' бросил исключение. ---- > System.InvalidOperationException: экземпляр "EfCeConfiguration" был установлен, но этот тип не был обнаружен в той же сборке, что и контекст DataContext. Или поместите тип DbConfiguration в ту же сборку, что и DbContext введите DbConfigurationTypeAttribute в тип DbContext, чтобы укажите тип DbConfiguration или задайте тип DbConfiguration в файл конфигурации. См. http://go.microsoft.com/fwlink/?LinkId=260883 для Дополнительная информация.
UPDATE 2, решение Как описано выше, мы можем иметь только одну конфигурацию. Это проблема, поскольку Sql и SqlCe использует разные поставщики. Если мы используем "SetDefaultConnectionFactory" для соответствия одному типу базы данных, другой будет терпеть неудачу.
Вместо этого поставьте соединение в контекст, как описано в сообщении, помеченном как ответ ниже. Как только вы всегда инициализируете контекст с помощью соединения, в отличие от строки соединения, вам хорошо идти. Вы можете удалить вызов SetDefaultConnectionFactory из конфигурации. Мы используем только код ниже для настройки контекста SqlCe и без конфигурации для контекста Sql.
public class CommonEfConfiguration : DbConfiguration
{
public CommonEfConfiguration()
{
// EF does not know if the ce provider by default,
// therefore it is required to be informed about it.
// The connection factories are not necessary since the connection
// is always created in the UnitOfWork classes
SetProviderServices(SqlCeProviderServices.ProviderInvariantName, SqlCeProviderServices.Instance);
}
}