【问题标题】:Password protected SQLite with Entity Framework Core带有 Entity Framework Core 的密码保护 SQLite
【发布时间】:2017-02-15 15:55:09
【问题描述】:

我正在尝试创建一个受密码保护的 SQLite 数据库,以便在使用 Entity Framework Core 的 WPF 应用程序中使用它。

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

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

【问题讨论】:

  • 您通过dbCon.SetPassword(myLitePW) 加密数据库,然后在连接字符串中使用密码:Data Source=c:\mydb.db;Version=3;Password=myLitePW;
  • 除非我弄错了,这适用于 EF6(在 System.Data.SQLite 包中)。但是使用 EF Core(在 Microsoft.Data.SQLite 包中),我找不到这样做的方法......(Microsoft.Data.SQLite 的 SQLiteConnection 中没有 SetPassword 方法)

标签: c# sqlite entity-framework-core


【解决方案1】:

根据这个article 和这个issue,没有办法(还没有?)使用Microsoft.Data.Sqlite 程序集(由EF Core 使用)加密数据库。

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

  • System.Data.SQLite.Core 包添加到项目中
  • 在配置您的 dbContext 时,将 optionsBuilder 提供给您自己的 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 替换为另一个处理加密数据库的程序(您可以在此repo 上找到免费的程序) )。但我没有测试它。

Here 是怎么做的!

【讨论】:

  • 当我使用这个时,我得到 System.ObjectDisposedException: 'Cannot access a disposed object.'
  • 好吧,你的代码中的某些东西必须在你的一个对象上调用Dispose()。您是否在任何地方使用using 子句?离开 using 子句时,用它定义的对象会被自动释放。
  • 感谢您的回复,我知道 using 子句的工作原理,问题是我在错误的地方使用了您的代码,您的回答完全正确
  • 在 xamarin 表单中,我不能使用 System.Data.SQLite.Core 。还有其他解决方案吗?
  • 感谢您的回复。 @fharreau
猜你喜欢
  • 2021-12-02
  • 2021-03-23
  • 2020-08-09
  • 2011-08-05
  • 1970-01-01
  • 1970-01-01
  • 2019-10-25
  • 2017-10-28
相关资源
最近更新 更多