web-dev-qa-db-ja.com

SQLitePCL.Batteries.Init()を呼び出す方法

アプリケーション用にSQLiteデータベースを作成しようとしていますが、このエラーに遭遇しました。

System.Exception: 'SQLitePCL.raw.SetProvider()を呼び出す必要があります。バンドルパッケージを使用している場合、これは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パッケージをインストールしましたが、2つのプロジェクトの違いは、データベースに使用したデータソースと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 });
    }
}
_

クラスライブラリには、次のようなFinancialContextがあります。

_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 is not in current contextになりました。参照がありませんか?

17
Tristan Trainer

これは、追加の依存関係を避けようとしてMicrosoft.EntityFrameworkCore.Sqlite.Coreパッケージを使用したときに起こりました。

代わりにSQLitePCLRawパッケージに依存するMicrosoft.EntityFrameworkCore.Sqliteパッケージをインストールして使用する必要があります。

27

何らかの理由でNuget Packageが必要な参照をインストールしていなかったため、パッケージを再インストールし、問題を修正しました!

SQLitePCL.raw*参照がありません。

1
Tristan Trainer

この非常に正確なエラーがありました。パッケージMicrosoft.Data.Sqlite.Core(2.2.4)がインストールされていましたが、SQLitePCLRaw.bundle_winsqlite3はインストールされていませんでした。

パッケージSQLitePCLRaw.bundle_winsqlite3(1.1.13)をインストールすると、問題が解決しました。

1
Varus Septimus

Nuget PackageMicrosoft.Data.Sqliteをインストールします(Microsoft.Data.Sqlite.Coreではありません)。 (私のバージョンは2.2.2です)

SQLitePCL.raw.SetProvider(new SQLitePCL.SQLite3Provider_e_sqlite3());を使用します

 connection = new SqliteConnection("Data Source = Sample.db");

 SQLitePCL.raw.SetProvider(new SQLitePCL.SQLite3Provider_e_sqlite3());

 connection.Open();

ただし、nuget packageの代わりにSystem.Data.SQLiteMicrosoft.Data.Sqliteを使用することをお勧めします

0
Stepan Ivanenko