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

问题描述 投票:0回答:9

我正在尝试为我的应用程序创建 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 包,两者之间的唯一区别是数据源和我用于数据库的 POCO 类。

谢谢。

编辑 我的程序当前由引用

Console application
.Net Framework Class Library
组成。
Console application
简单的构造函数如下所示:

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
不在当前上下文中,这让我觉得我缺少参考?

c# entity-framework sqlite
9个回答
180
投票

当我试图避免任何额外的依赖项并选择

Microsoft.EntityFrameworkCore.Sqlite.Core
包时,这发生在我身上。

您应该安装并使用

Microsoft.EntityFrameworkCore.Sqlite
包,它依赖于
SQLitePCLRaw
包。


42
投票

安装

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();

但我建议使用

nuget package
System.Data.SQLite
代替
Microsoft.Data.Sqlite


13
投票

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


10
投票

我遇到了这个非常确切的错误。结果我安装了软件包

Microsoft.Data.Sqlite.Core
(2.2.4),但没有安装
SQLitePCLRaw.bundle_winsqlite3

安装软件包

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


5
投票

我在使用

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();
    }
}

2
投票

由于某种原因,

Nuget Package
没有安装所需的参考,重新安装了软件包,它已经纠正了问题!

缺少

SQLitePCL.raw*
参考文献。


0
投票

当我尝试使用 Microsoft.EntityFrameworkCore.Sqlite" Version="2.2.6" 时,我遇到了同样的问题。我所做的是将版本降级为我之前使用的 2.2.2。然后问题就没有发生。


0
投票

因为我想使用最新版本的SQLite(3.45.2)。 Microsoft.Data.Sqlite 引入了一个旧版本,该版本缺乏较新的 jsonb (json blob) 功能。我通过添加以下 nuget 包解决了这个问题:

Microsoft.Data.Sqlite.Core (version at the time 8.0.3)
Microsoft.EntityFrameworkCore (version at the time 8.0.3)
Microsoft.EntityFrameworkCore.Sqlite (version at the time 8.0.3)
SQLitePCLRaw.bundle_esqlite3 (version at the time 2.1.8)
SQLitePCLRaw.core (version at the time 2.1.8)

这似乎解决了仍然依赖于旧版 SQLitePCLRaw 2.1.6 库的任何传递依赖问题。

一些附加信息: https://github.com/dotnet/efcore/blob/main/src/EFCore.Sqlite.Core/PACKAGE.md https://www.nuget.org/packages/Microsoft.Data.Sqlite.Core/#readme-body-tab


-1
投票

在 Xamarin.iOs 上我也遇到了同样的问题。

解决方案:在

SQLitePCL.Batteries_V2.Init()
类的
FinishedLaunching
方法中调用
AppDelegate

来源:https://learn.microsoft.com/en-us/dotnet/standard/data/sqlite/xamarin

© www.soinside.com 2019 - 2024. All rights reserved.