Установить поставщика для SQL (DbConfiguration)

#c# #entity-framework

#c# #сущность-фреймворк

Вопрос:

У меня была программа для создания базы данных SQL с помощью Entity Framework code-first.

Я добавляю возможность создания базы данных Sqlite, но для этого требуется добавить поставщика.

 public class Configuration : DbConfiguration, IDbConnectionFactory
{
    public Configuration()
    {
        SetProviderFactory("System.Data.SQLite", SQLiteFactory.Instance);
        SetProviderFactory("System.Data.SQLite.EF6", SQLiteProviderFactory.Instance);

        var providerServices = (DbProviderServices)SQLiteProviderFactory.Instance.GetService(typeof(DbProviderServices));

        SetProviderServices("System.Data.SQLite", providerServices);
        SetProviderServices("System.Data.SQLite.EF6", providerServices);

        SetDefaultConnectionFactory(this);
    }

    public DbConnection CreateConnection(string connectionString)
        => new SQLiteConnection(connectionString);
}
 

И теперь, когда я пытаюсь создать базу данных SQL, я получаю ошибки:

В текущей команде произошла серьезная ошибка. Результаты, если таковые имеются, следует отбросить.

Источник ошибки:

Поставщик данных .Net SqlClient

Из того, что я читаю SetDefaultConnectionFactory(this); , меняется конфигурация по умолчанию. Но я нигде не могу найти поставщика базы данных SQL.

 using (var context = CreateContext())
{
    InitializeAndUpgradeDatabase(context);
}

public DeviceModelContext CreateContext()
{
    return new DeviceModelContext(connectionString);
}

public static void InitializeAndUpgradeDatabase(DbContext context)
{
    if (context.Database.Exists())
        return;

    try
    {
        context.Database.CreateIfNotExists();
    }
    catch (Exception e)
    {
        throw;
    }
}
 

Он выдает ошибку context.Database.CreateIfNotExists() после OnModelCreating(DbModelBuilder modelBuilder)

Комментарии:

1. «проблема с поставщиком» — показать фактическую ошибку. И покажите код, в котором вы создаете базу данных.

2. Не существует такой вещи, как база данных SQL — SQL — это просто язык структурированных запросов — язык, используемый многими системами баз данных, но это не продукт базы данных. Многие вещи зависят от поставщика, поэтому нам действительно нужно знать, какую систему баз данных (и какую версию) вы используете …. (пожалуйста, обновите теги соответствующим образом)

3. Ошибка @CodeCaster: в текущей команде произошла серьезная ошибка. Результаты, если таковые имеются, следует отбросить. Источник ошибки: «Поставщик данных .Net SqlClient». Больше информации нет. Он работал до того, как я добавил класс конфигурации для установки поставщика для sqlite. Теперь, даже если я удалю этот класс, он не будет работать для sql.

4. Какова ваша строка подключения?

5. Неясно, когда и как вы создали базу данных SQLite. Глядя на проект GITHUB, есть версии в файлах csproj и sln. Поэтому я подозреваю, что есть проблемы с совместимостью и что все должно быть перестроено с использованием вашей текущей конфигурации. Я не знаю, что изменилось между временем создания базы данных и тем, что вы используете в настоящее время.

Ответ №1:

Проблема заключалась в том, что он всегда создавал экземпляр конфигурации и всегда устанавливал поставщика SQLLite.

Мое решение:

 public class Configuration : DbConfiguration, IDbConnectionFactory
{
    public SqlTypeEnum sqlTypeEnum = SqlTypeEnum.Sql;

    public Configuration()
    {
        SetDefaultConnectionFactory(this);
    }
    public Configuration(SqlTypeEnum sqlTypeEnum)
    {
        this.sqlTypeEnum = sqlTypeEnum;
        SetProviderFactory("System.Data.SQLite", SQLiteFactory.Instance);
        SetProviderFactory("System.Data.SQLite.EF6", SQLiteProviderFactory.Instance);

        var providerServices = (DbProviderServices)SQLiteProviderFactory.Instance.GetService(typeof(DbProviderServices));

        SetProviderServices("System.Data.SQLite", providerServices);
        SetProviderServices("System.Data.SQLite.EF6", providerServices);
        SetDefaultConnectionFactory(this);
    }

    public DbConnection CreateConnection(string connectionString)
    {
        if(sqlTypeEnum == SqlTypeEnum.Sql)
            return new SqlConnection(connectionString);
        else
            return new SQLiteConnection(connectionString);
    }
}
 

Комментарии:

1. Я создал этот класс для настройки кода моих поставщиков — потому что у меня нет контроля над приложением, использующим мою библиотеку классов, — но код никогда не запускается. Нужно ли мне вручную создавать экземпляр экземпляра Configuration ? Пожалуйста, как называется код в этом классе? Чего мне не хватает?