在一个asp.net core项目中,我需要一个加密的SQLite数据库。为此,我创建了自己的
我有一个扩展方法来配置我的EF上下文,通过创建连接并将其传递给上下文。
SqliteEncryptedConnection
,它继承自Microsoft.Data.Sqlite.SqliteConnection
,并在Open()
方法中设置加密密钥(执行PRAGMA key = ...)。我有一个扩展方法来配置我的EF上下文,通过创建连接并将其传递给上下文。
public static void UseEncryptedSqlite(this DbContextOptionsBuilder optionsBuilder, string connectionString, string password)
{
var connection = new SqliteEncryptedConnection(connectionString, password);
connection.Open();
optionsBuilder.UseSqlite(connection);
}
在将连接交给EF之前,我必须先打开它,否则EF会为每个单独的查询自动开关连接,而且现在Open()
方法的成本相当高。
我的问题是这样做后我的连接从未被释放或关闭!
- 在Open方法中设置加密密钥是否正确?
- 有没有办法知道上下文被释放了?或者在上下文被释放后配置它来关闭和释放连接?
- 是否有其他(更好)的管理连接的方法?
一个不太好的解决方法是在EF上下文的Dispose方法中释放连接,但我真的不想处理一个被注入并且不是上下文拥有的依赖项。
DbContextOptions
对象不会被处理并且将被重用于所有EF Core DbContext实例,因为选项在DbContext初始化时传递给它。自2.0预览版1以来,甚至可以对DbContext实例进行轮询以获得高性能场景,请参阅此博客文章。 - Tseng