实体框架核心连接管理

时间:2017-10-12 16:17:29

标签: .net sqlite asp.net-core entity-framework-core

在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()方法现在非常昂贵。

我对此解决方案的问题是我的连接永远不会丢弃也不会关闭!

  1. 在Open?
  2. 中设置加密密钥是否正确
  3. 有没有办法知道何时处理上下文?或者将其配置为在处理后关闭并处理连接?
  4. 是否有其他(更好)的方式来管理连接?
  5. 脏解决方案是在EF上下文的Dispose方法中处理连接,但我真的不想处置注入的依赖项,而不是由上下文拥有。

1 个答案:

答案 0 :(得分:1)

我得到了在EF核心团队工作的Brice Lambson的回答:

  

你正朝着正确的方向前进 - 少打开连接。记得,   SQLite连接本质上只是文件流,所以保留它们   开放更长时间并不是一个问题。

     

如果每个连接只有一个DbContext实例,那么   即使创建了连接,DbContext仍然可以拥有该连接   外部。只需将连接部署在DbContext.Dispose()。

中      

如果这还不够,您可以尝试创建连接池。   管理生命周期可能会变得棘手。重要的是一个   连接不会在创建它的线程之外使用。

     

使用Cache = Shared(即Shared-Cache Mode)也可能有所帮助   吞吐量。