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);
        }
    }

Ответы на вопрос(3)

Ваш ответ на вопрос