По какой причине 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 шт):
Сам нужно переопределить метод 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? Увы, нет. Нашла ли я ответ, как все таки получить работающее приложение? Пожалуй. Если кто-то найдет ответ на мой первый вопрос - буду только рада.