我正在尝试为我的应用程序创建 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
不在当前上下文中,这让我觉得我缺少参考?
当我试图避免任何额外的依赖项并选择
Microsoft.EntityFrameworkCore.Sqlite.Core
包时,这发生在我身上。
您应该安装并使用
Microsoft.EntityFrameworkCore.Sqlite
包,它依赖于 SQLitePCLRaw
包。
安装
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
我遇到了这个非常确切的错误。结果我安装了软件包
Microsoft.Data.Sqlite.Core
(2.2.4),但没有安装SQLitePCLRaw.bundle_winsqlite3
。
安装软件包
SQLitePCLRaw.bundle_winsqlite3
(1.1.13)解决了这个问题。
我在使用
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();
}
}
由于某种原因,
Nuget Package
没有安装所需的参考,重新安装了软件包,它已经纠正了问题!
缺少
SQLitePCL.raw*
参考文献。
当我尝试使用 Microsoft.EntityFrameworkCore.Sqlite" Version="2.2.6" 时,我遇到了同样的问题。我所做的是将版本降级为我之前使用的 2.2.2。然后问题就没有发生。
因为我想使用最新版本的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
在 Xamarin.iOs 上我也遇到了同样的问题。
解决方案:在
SQLitePCL.Batteries_V2.Init()
类的 FinishedLaunching
方法中调用 AppDelegate
。
来源:https://learn.microsoft.com/en-us/dotnet/standard/data/sqlite/xamarin