Как мне вызвать SQLitePCL.Batteries.Init ().?

Я пытаюсь создать базу данных 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 не в текущем контексте, что заставляет меня думать, что мне не хватает ссылки?

форумы.xamarin.com/discussion/88434/…
stuartd 07.06.2018 18:57

Спасибо, Стюарт, я видел это, когда искал ответ, но это не совсем говорит о том, как вы это делаете. Я создаю приложение WPF, могу ли я ввести этот код в метод OnStartup? На самом деле не совсем понятно, что это делает на самом деле, просто кто-то поместил строку кода где-то в своем приложении. Заранее спасибо!

Tristan Trainer 07.06.2018 23:37

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

Tristan Trainer 08.06.2018 00:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
36
3
16 257
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

По какой-то причине Nuget Package не установил необходимые ссылки, переустановил пакет, и проблема была исправлена!

Отсутствуют ссылки на SQLitePCL.raw*.

Вы имеете в виду, что ваша проблема была решена путем переустановки пакета, а не другими предложенными решениями, верно? Я спрашиваю, потому что у меня аналогичная проблема, когда он жалуется: Could not load file or assembly 'SQLitePCLRaw.core. Как и вы, я тоже использую EF (а не EF Core.

nam 31.05.2020 20:44

Да, это правильное название - мне просто нужно было правильно переустановить пакет, и он сработал - это было более двух лет назад, но я предполагаю, что возникнет такая же проблема :)

Tristan Trainer 04.06.2020 01:51
Ответ принят как подходящий

Это случилось со мной, когда я попытался избежать дополнительных зависимостей и выбрал пакет Microsoft.EntityFrameworkCore.Sqlite.Core.

Вместо этого вам следует установить и использовать пакет Microsoft.EntityFrameworkCore.Sqlite, который зависит от пакета SQLitePCLRaw.

Это также работает, если вам нужно переключиться с Microsoft.Data.Sqlite.Core на Microsoft.Data.Sqlite.

Patrick 04.04.2021 21:39

Также перестройте решение перед повторным запуском dotnet ef database update.

Jan 05.06.2021 15:07

Установите 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.

Professor Tom 21.04.2019 19:55

«Я советую использовать nuget-пакет System.Data.SQLite вместо Microsoft.Data.Sqlite» Почему? Мне просто пришлось переключиться с этого на это из-за этой проблемы stackoverflow.com/questions/13028069/…, и ни одно из решений там не помогло мне. "SQLitePCL.raw.SetProvider" Мне это не понадобилось (возможно, что-то изменилось с тех пор, как это решение было опубликовано.

willbush 03.12.2020 21:02

У меня была очень точная ошибка. Оказалось, что у меня установлен пакет 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, как сказал Патрик, здесь помог мне

Другие вопросы по теме