2014-02-05 4 views
4

Я застрял в EF 6, и документация разрежена - не получилось, что это решило в течение дня.Использование репозитория EF с пользовательскими объектами подключения?

Я пытаюсь использовать Code First в репозитории базы данных, который у нас есть. Из-за сложной инициализации I должен использовать мой собственный заводский метод для инициализации подкласса контекста, а I должен включить мое собственное соединение sql или создать собственную фабрику.

следующих инициализации класса:

мы имеем:

public class Repository : DbContext { 

static string _connectionString; 

    static Repository() { 
     Database.SetInitializer<Repository>(null); 
     var type = typeof(System.Data.Entity.SqlServer.SqlProviderServices); 
     _connectionString = ** method to get connection string** 
    } 

    public static Repository Create() { 
     SqlConnection connection = new SqlConnection(_connectionString); 
     connection.Open(); 
     connection.BeginTransaction(IsolationLevel.ReadCommitted).Commit(); 
     return new Repository(connection); 
    } 

К сожалению, работает он дует со следующим исключением с первой попытки выбрать некоторые лица:

Не удалось определить имя поставщика для поставщика фабрики типа «System.Data.SqlClient.SqlClientFactory». Убедитесь, что поставщик ADO.NET установлен или зарегистрирован в конфигурации приложения.

Я совершенно не в своем уме, как это исправить.

Мой конфигурационный файл в использовании веб-приложение читает:

<entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> 
     <parameters> 
     <parameter value="v11.0" /> 
     </parameters> 
    </defaultConnectionFactory> 
    <providers> 
     <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer, Version=6.0.0.0" /> 
    </providers> 
</entityFramework> 

Любой человек может сказать мне, как исправить это? Моя альтернатива - сначала вернуться к модели, но я бы очень хотел дать код сначала попробовать.

+0

Тот же тип ошибки фиксируется в это решение. http://stackoverflow.com/questions/19903037/entity-framework-profiler-asp-net-mvc4-with-ef-6-unable-to-determine-the-prov – Bharadwaj

+0

@Bharadwaj Интересно, что нет. Как ответ есть, что это была ошибка в профилировщике ... который я даже не использую. – TomTom

+0

Это должно быть подробное описание того, как вы создаете строку подключения. Для чего вам нужен тип 'SqlProviderServices'? –

ответ

1

У меня были такие же требования к моим проектам: репозитории EF должны были принимать экземпляры подключений, созданные на моем собственном заводе. С этой целью я решил полностью игнорировать схему файла конфигурации EF. Вместо этого я сделал следующее:

public class Repository : DbContext 
{ 
    static Repository() 
    { 
     Database.SetInitializer<Repository>(null); 
    } 

    public Repository(SqlConnection existingConnection, bool contextOwnsConnection) 
     : base(existingConnection, contextOwnsConnection) 
    { 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     // creating the model myself 
    } 
    // (...) 
} 

Поскольку он может принимать примеры подключения с внешней стороны я свободен использовать все фабрики соединений я хочу и полностью игнорировать схему конфигурационного файла EF в.

Если вы хотите, чтобы ваша фабрика соединений внутри хранилища (который я не рекомендую для разделения проблем), можно добавить следующее к вышесказанному:

public Repository() 
    : base(CreateConnection(), true) 
{ 
} 

private static SqlConnection CreateConnection() 
{ 
    // do whatever you have to do to create your SqlConnection instance, using your own rules 
} 
Смежные вопросы