4

Вопрос по entity-framework, entity-framework-6, .net – Использование EF Repository с пользовательскими объектами подключения?

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

Я пытаюсь использовать Code First в нашем хранилище базы данных. Из-за сложной инициализации ядолжен использовать мой собственный метод фабрики для инициализации подкласса контекста, и ядолжен положить мое собственное соединение 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>

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

(Независимо от строки подключения в вашем коде) Есть ли что-то подобное в строках подключения? Существует также провайдер, который вы должны установить.<connectionStrings> <add name="Repository " connectionString="connectionString" providerName="System.Data.EntityClient"/> </connectionStrings>

от Rodion

Какую именно версию EF вы используете? Можете ли вы опубликовать свой репозиторийRepository(connection) конструктор?

от nemesv

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

от Gert Arnold

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

от TomTom

Такой же тип ошибки исправлен в этом решении.stackoverflow.com/questions/19903037/...

от Bharadwaj
1 ответ
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
}

Похожие вопросы