Я пытаюсь создать базу данных SQLite для своего приложения и столкнулся с этой ошибкой.
System.Exception: 'You need to call SQLitePCL.raw.SetProvider(). If you are using a bundle package, this is done by calling SQLitePCL.Batteries.Init().'
Я создал простое консольное приложение, которое запускает тот же код для создания без проблем. Код выглядит так!
using (var dataContext = new SampleDBContext())
{
dataContext.Accounts.Add(new Account() { AccountName = name, AccountBalance = balance });
}
public class SampleDBContext : DbContext
{
private static bool _created = false;
public SampleDBContext()
{
if (!_created)
{
_created = true;
Database.EnsureDeleted();
Database.EnsureCreated();
}
}
protected override void OnConfiguring(DbContextOptionsBuilder optionbuilder)
{
optionbuilder.UseSqlite(@"Data Source = "Source folder"\Database.db");
}
public DbSet<Account> Accounts { get; set; }
}
Может ли кто-нибудь пролить свет на эту проблему? Я установил одни и те же пакеты Nuget в оба проекта, единственная разница между ними - это источник данных и классы POCO, которые я использовал для базы данных.
Спасибо.
Редактировать
Моя программа в настоящее время состоит из Console application, который ссылается на .Net Framework Class Library. У Console application simple есть конструктор, который выглядит следующим образом:
public Program()
{
using (var db = new FinancialContext())
{
db.Accounts.Add(new Account() { AccountName = "RBS", AccountBalance=20 });
}
}
Библиотека классов имеет следующий финансовый контекст:
public class FinancialContext : DbContext
{
public DbSet<Account> Accounts { get; set; }
public FinancialContext()
{
# Database.EnsureDeleted();
Database.EnsureCreated();
}
protected override void OnConfiguring(DbContextOptionsBuilder optionbuilder)
{
optionbuilder.UseSqlite(@"Data Source = "Some Source Folder"\Database.db");
}
}
Вышеупомянутая ошибка отображается в точке символа #. Есть ли проблема с тем, как я кодирую? Я действительно хотел бы знать, в чем проблема, чтобы я мог исправить ее должным образом, а не применять «исправление». Также я попробовал это предложение в комментариях, но размещение строки кода SQLitePCL.raw.SetProvider(new SQLitePCL.SQLite3Provider_e_sqlite3()); в Console Application дало ошибку SQLitePCL не в текущем контексте, что заставляет меня думать, что мне не хватает ссылки?
Спасибо, Стюарт, я видел это, когда искал ответ, но это не совсем говорит о том, как вы это делаете. Я создаю приложение WPF, могу ли я ввести этот код в метод OnStartup? На самом деле не совсем понятно, что это делает на самом деле, просто кто-то поместил строку кода где-то в своем приложении. Заранее спасибо!
Я отредактировал вопрос с дополнительными комментариями, возможно, можно добавить больше деталей к вопросу.





По какой-то причине Nuget Package не установил необходимые ссылки, переустановил пакет, и проблема была исправлена!
Отсутствуют ссылки на SQLitePCL.raw*.
Вы имеете в виду, что ваша проблема была решена путем переустановки пакета, а не другими предложенными решениями, верно? Я спрашиваю, потому что у меня аналогичная проблема, когда он жалуется: Could not load file or assembly 'SQLitePCLRaw.core. Как и вы, я тоже использую EF (а не EF Core.
Да, это правильное название - мне просто нужно было правильно переустановить пакет, и он сработал - это было более двух лет назад, но я предполагаю, что возникнет такая же проблема :)
Это случилось со мной, когда я попытался избежать дополнительных зависимостей и выбрал пакет Microsoft.EntityFrameworkCore.Sqlite.Core.
Вместо этого вам следует установить и использовать пакет Microsoft.EntityFrameworkCore.Sqlite, который зависит от пакета SQLitePCLRaw.
Это также работает, если вам нужно переключиться с Microsoft.Data.Sqlite.Core на Microsoft.Data.Sqlite.
Также перестройте решение перед повторным запуском dotnet ef database update.
Установите Nuget PackageMicrosoft.Data.Sqlite (не Microsoft.Data.Sqlite.Core). (моя версия 2.2.2)
и используйте SQLitePCL.raw.SetProvider (новый SQLitePCL.SQLite3Provider_e_sqlite3 ());
connection = new SqliteConnection("Data Source = Sample.db");
SQLitePCL.raw.SetProvider(new SQLitePCL.SQLite3Provider_e_sqlite3());
connection.Open();
но я советую использовать nuget packageSystem.Data.SQLite вместо Microsoft.Data.Sqlite
Имя вашего пакета (а, в зависимости от того, как вы хотите их подсчитать) неверно. Они должны быть Microsoft.Data.SqliteНЕТMictosoft.Data.Sqlite.
«Я советую использовать nuget-пакет System.Data.SQLite вместо Microsoft.Data.Sqlite» Почему? Мне просто пришлось переключиться с этого на это из-за этой проблемы stackoverflow.com/questions/13028069/…, и ни одно из решений там не помогло мне. "SQLitePCL.raw.SetProvider" Мне это не понадобилось (возможно, что-то изменилось с тех пор, как это решение было опубликовано.
У меня была очень точная ошибка. Оказалось, что у меня установлен пакет Microsoft.Data.Sqlite.Core (2.2.4), а не SQLitePCLRaw.bundle_winsqlite3.
Установка пакета SQLitePCLRaw.bundle_winsqlite3 (1.1.13) решила проблему.
У меня была такая же проблема, когда я пытался использовать Microsoft.EntityFrameworkCore.Sqlite "Version =" 2.2.6 ". Я понизил версию до 2.2.2, которую я использовал ранее. Тогда проблема не возникает.
У меня возникла эта проблема при работе с Microsoft.EntityFrameworkCore.Sqlite версии 3.1.10. Приведенные выше решения не помогли мне. Затем я изменил My DbContext следующим образом (добавил SQLitePCL.Batteries.Init(); в метод OnConfiguring), и проблема исчезла !!!
public class ApplicationDbContext : DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite("Data Source=mydb.db");
SQLitePCL.Batteries.Init();
}
}
Переход с Microsoft.Data.Sqlite.Core на Microsoft.Data.Sqlite, как сказал Патрик, здесь помог мне