По какой причине EntityFramework не видит провайдер SQLite?

Помогите пожалуйста, третий день голову ломаю над проблемой.

Пытаюсь написать WinForms приложение с внутренней базой данных (SQLite), управление которой ведется с помощью EntityFramework. Проблема заключается в том, что при попытке добавить запись в таблицу я ловлю вот такое исключение:

"No Entity Framework provider found for the ADO.NET provider with invariant name 'System.Data.SQLite'. Make sure the provider is registered in the 'entityFramework' section of the application config file. See http://go.microsoft.com/fwlink/?LinkId=260882 for more information."

Вот файл App.config.

    <?xml version="1.0" encoding="utf-8"?>
<configuration>
  
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
  </startup>
  
  <entityFramework>
    <providers>
      <!-- Провайдер для SQL Server -->
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      <!-- Провайдер для SQLite -->
      <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
    </providers>
  </entityFramework>

  <system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SQLite.EF6" />
      <add name="SQLite Data Provider (Entity Framework 6)"
           invariant="System.Data.SQLite.EF6"
           description=".NET Framework Data Provider for SQLite (Entity Framework 6)"
           type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" />
      <remove invariant="System.Data.SQLite" />
      <add name="SQLite Data Provider"
           invariant="System.Data.SQLite"
           description=".NET Framework Data Provider for SQLite"
           type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
    </DbProviderFactories>
  </system.data>

  <connectionStrings>
    <add name="FinanceHelperConnection"
         connectionString="Data Source=|DataDirectory|\FinanceHelperDB.sqlite;"
         providerName="System.Data.SQLite.EF6"/>
  </connectionStrings>
  
</configuration>

Вот код метода, на котором ломается приложение:

private void createItemBtn_Click(object sender, EventArgs e)
    {
        if (itemNameField.Texts != "")
        {
            using (AppDbContext db = new AppDbContext())
            {
                Item newItem = new Item() { Name = itemNameField.Texts };
                db.Items.Add(newItem);
                db.SaveChanges();
                reloadData();
            }
        }
        else
        {
            MessageBox.Show("Стой, ты забыл заполнить поле 'Название'");
        }
    }

Класс контекста тоже "классический":

public class AppDbContext : DbContext
{
    public AppDbContext() : base("name=FinanceHelperConnection")
    {
    }

    public DbSet<Item> Items { get; set; }
    public DbSet<Category> Categories { get; set; }
    public DbSet<Transaction> Transactions { get; set; }
}

Библиотеки уже 100500 раз переустанавливала как через менеджер, так и через консоль - не помогает (их обновление до последней версии тоже не помогло).

Шутка ли, но ChatGpt тоже чешет репу и повторяет в режиме дятла-трудяги "Все вроде бы правильно. Проверьте, установили ли вы библиотеки и переустановите их при необходимости." Подскажите пожалуйста, в чем проблема и как её решить?


Ответы (2 шт):

Автор решения: Faraday

Сам нужно переопределить метод DbContext.OnConfiguring. Будет примерно вот такой вот код у вас:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder.UseSqlite("your connection string here");
}

Строку подключения можете узнать от сюда. Либо упрощённый вариант, что бы разместить файл базы данных в корне проекта:

Data Source=mydb.db

UPD: Для того, что бы метод .UseSqlite стал доступен, вам нужно так же установить NuGet пакет Microsoft.EntityFrameworkCore.Sqlite

→ Ссылка
Автор решения: Ксения Манжула

Итак, пересмотрев много что (явно не все - пересмотреть вообще все явно не хватит ни времени, ни сил, ни возможности) - пришла к выводу, что на старой версии .NET Framework работать...реально, но тебе надоест плясать с бубном и запивать это все дело успокоительным. То, что генерируется в файле App.config после установки нужных пакетов через NuGet - по умолчанию ошибочно. Исправил файл App.config? Хорошо, теперь попробуй включить транзакции, только учти, что у тебя это не получится, ведь транзакции тоже требуют провайдер. Решение этой проблемы - как я понимаю, в определенном пакете, но он не устанавливается на старые версии .NET Framework.

Как итог, пришлось просто создать новый проект с использованием свежей версии .NET, EntityFramework.Core и соответствующей версии SQLite, и дальше - дело пошло: проблем с провайдером замечено не было, транзакции спокойно проводились (ну, почти спокойно, сначала пришлось установить дополнительный пакет), БД создалась и запись/чтение проблем не вызвали.

Нашла ли я конкретный ответ, каким образом подружить старый .NET Framework, EntityFramework и SQLite? Увы, нет. Нашла ли я ответ, как все таки получить работающее приложение? Пожалуй. Если кто-то найдет ответ на мой первый вопрос - буду только рада.

→ Ссылка