我如何调用SQLitePCL.Batteries.Init().?

Tri*_*ner 18 c# sqlite entity-framework

我正在尝试为我的应用程序创建一个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; }
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释这个问题吗?我在两个项目上安装了相同的Nuget Packages,两者之间的唯一区别是数据源和我用于数据库的POCO类.

谢谢.

编辑 我的程序目前包含一个Console application引用a的程序.Net Framework Class Library.在Console application简单的有一个构造函数如下:

public Program()
{   
    using (var db = new FinancialContext())
    {
        db.Accounts.Add(new Account() { AccountName = "RBS", AccountBalance=20 });
    }
}
Run Code Online (Sandbox Code Playgroud)

类库有一个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");
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的错误显示在#符号点,我编码的方式有问题吗?我真的想知道问题是什么,所以我可以正确地修复它而不是应用'修复'.另外我在评论中尝试了这个建议,但是把代码行SQLitePCL.raw.SetProvider(new SQLitePCL.SQLite3Provider_e_sqlite3());放在Console Application给出的错误SQLitePCL中不是在当前的上下文中,这让我觉得我错过了一个引用?

Ren*_*elm 28

当我试图避免任何其他依赖项并且去了Microsoft.EntityFrameworkCore.Sqlite.Core包时,这发生在我身上.

您应该安装并使用该Microsoft.EntityFrameworkCore.Sqlite包,它依赖于SQLitePCLRaw包.

  • 如果您需要从“Microsoft.Data.Sqlite.Core”切换到“Microsoft.Data.Sqlite”,这也适用。 (3认同)

Ste*_*nko 13

安装Nuget Package Microsoft.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();
Run Code Online (Sandbox Code Playgroud)

但我建议nuget package System.Data.SQLite改用Microsoft.Data.Sqlite

  • “我建议使用 nuget 包 System.Data.SQLite 而不是 Microsoft.Data.Sqlite”为什么?由于这个问题,我不得不从这个切换到这个,/sf/ask/911964861/,并且那里的解决方案都不适合我。“SQLitePCL.raw.SetProvider”这对我来说不是必需的(也许自从发布此解决方案后发生了一些变化。 (3认同)

小智 13

正如帕特里克所说,从 切换Microsoft.Data.Sqlite.Core这里对我有用Microsoft.Data.Sqlite


Var*_*mus 10

我有这个非常确切的错误。事实证明我Microsoft.Data.Sqlite.Core安装了软件包(2.2.4),但没有安装SQLitePCLRaw.bundle_winsqlite3

安装包SQLitePCLRaw.bundle_winsqlite3(1.1.13)解决了这个问题。


小智 5

我在使用Microsoft.EntityFrameworkCore.Sqlite3.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();
    }
}
Run Code Online (Sandbox Code Playgroud)