EF6 и несколько конфигураций (SQL Server и SQL Server Compact)
Обновить: Проблема решена, см. Конец этого вопроса.
Проблема:
Мы пытаемся использовать Entity Framework 6 и конфигурацию на основе кода в сценарии, в котором мы использовали и SQL Server, и SQL Server CE в одномAppDomain
.
Этот довольно простой сценарий, кажется, не поддерживается «намеренно». От команды EF:
Примечание. Мы не поддерживаем использование нескольких классов конфигурации в одном домене приложений. Если вы используете этот атрибут для установки разных классов конфигурации для двух контекстов, будет выдано исключение.
Больше информации здесь:Конфигурация на основе кода (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));
}
}
ОБНОВИТЬ:
Ошибка, которую мы получаем:
System.TypeInitializationException: инициализатор типа для MyProject.Repositories.Base.DataContext вызвал исключение. ----> System.InvalidOperationException: экземпляр EfCeConfiguration был установлен, но этот тип не был обнаружен в той же сборке, что и контекст DataContext. Либо поместите тип DbConfiguration в ту же сборку, что и тип DbContext, используйте DbConfigurationTypeAttribute для типа DbContext, чтобы указать тип DbConfiguration, либо задайте тип DbConfiguration в файле конфигурации. Видетьhttp://go.microsoft.com/fwlink/?LinkId=260883 для дополнительной информации.
ОБНОВЛЕНИЕ 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);
}
}