在asp.net核心项目中,我需要一个加密的SQLite数据库。为此,我创建了自己的SqliteEncryptedConnection
,它继承自Microsoft.Data.Sqlite.SqliteConnection
,并在Open()
方法中设置加密密钥(执行PRAGMA密钥= ...)
我有一个扩展方法,通过创建连接并提供它来配置我的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()
方法现在非常昂贵。
我对此解决方案的问题是我的连接永远不会丢弃也不会关闭!
脏解决方案是在EF上下文的Dispose方法中处理连接,但我真的不想处置注入的依赖项,而不是由上下文拥有。
答案 0 :(得分:1)
我得到了在EF核心团队工作的Brice Lambson的回答:
你正朝着正确的方向前进 - 少打开连接。记得, SQLite连接本质上只是文件流,所以保留它们 开放更长时间并不是一个问题。
如果每个连接只有一个DbContext实例,那么 即使创建了连接,DbContext仍然可以拥有该连接 外部。只需将连接部署在DbContext.Dispose()。
中如果这还不够,您可以尝试创建连接池。 管理生命周期可能会变得棘手。重要的是一个 连接不会在创建它的线程之外使用。
使用Cache = Shared(即Shared-Cache Mode)也可能有所帮助 吞吐量。