C# 具有实体框架核心的密码保护SQLite

C# 具有实体框架核心的密码保护SQLite,c#,sqlite,entity-framework-core,C#,Sqlite,Entity Framework Core,我试图创建一个受密码保护的SQLite数据库,以便在使用EntityFramework核心的WPF应用程序中使用它 我了解了如何从现有的SQLite DB(数据库优先方法)生成我的DbContext和实体,但我无法让它使用受密码保护的DB 实际上,我甚至不知道如何创建一个受密码保护的SQLite DB。加密数据库和受密码保护的数据库有什么区别?根据这一点和这一点,没有办法(目前?)使用Microsoft.Data.Sqlite程序集(由EF Core使用)加密数据库 基于此,以下是我为使其与EF

我试图创建一个受密码保护的SQLite数据库,以便在使用EntityFramework核心的WPF应用程序中使用它

我了解了如何从现有的SQLite DB(数据库优先方法)生成我的DbContext和实体,但我无法让它使用受密码保护的DB

实际上,我甚至不知道如何创建一个受密码保护的SQLite DB。加密数据库和受密码保护的数据库有什么区别?

根据这一点和这一点,没有办法(目前?)使用Microsoft.Data.Sqlite程序集(由EF Core使用)加密数据库

基于此,以下是我为使其与EF Core一起工作所做的工作:

  • 将包添加到项目中
  • 在配置数据库上下文时,为
    选项生成器提供您自己的
    DbConnection

    var conn = new SQLiteConnection(@"Data Source=yourSQLite.db;");
    conn.Open();
    
    var command = conn.CreateCommand();
    command.CommandText = "PRAGMA key = password;";
    command.ExecuteNonQuery();
    
    optionsBuilder.UseSqlite(conn);
    
使用
System.Data.SQLite.Core
程序集中的
SQLiteConnection
(可管理加密数据库)而不是
Microsoft.Data.SQLite
中的
SQLiteConnection
非常重要


根据这篇文章,您可能可以使用内置的
SqliteConnection
,将
Microsoft.Data.Sqlite
程序集中附带的
sqlite3.dll
替换为另一个处理加密数据库的程序集(您可以在此找到免费的)。但我没有测试它


是怎么做到的

您可以通过
dbCon.SetPassword(myLitePW)
对数据库进行加密,然后在连接字符串中使用密码:
Data Source=c:\mydb.DB;版本=3;密码=myLitePW除非我弄错了,否则这适用于EF6(在System.Data.SQLite包中)。但是使用EF Core(在Microsoft.Data.SQLite包中),我找不到这样做的方法。。。(来自Microsoft.Data.SQLite的SQLite连接中没有SetPassword方法)当我使用此方法时,我得到了System.ObjectDisposedException:“无法访问已处置的对象”。嗯,代码中的某些内容必须对其中一个对象调用
Dispose()
。您是否在任何地方使用
using
子句?离开using子句时,用它定义的对象将自动释放。感谢您的回复,我知道using子句是如何工作的,问题是我在错误的位置使用了您的代码,并且您的答案在xamarin表单中完全正确,我无法使用System.Data.SQLite.Core。还有其他解决方案吗?谢谢回复@法罗