2017-10-12 217 views
1

在一個asp.net核心項目中,我需要一個加密的SQLite數據庫。爲此,我做了我自己SqliteEncryptedConnectionMicrosoft.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. 是否有另一種更好的方式來管理連接?

骯髒的解決方案將配置連接在EF上下文Dispose方法,但我真的不想處置被注入和不屬於上下文的依賴。

+0

它的設計,如果我正確地理解你的問題。 'DbContextOptions'對象不會被丟棄,並且將被重用於EF Core DbContext的所有實例,因爲這些選項在初始化時被傳遞給DbContext。從2.0 preview1開始,即使DbContext實例也可以針對高性能場景進行輪詢,請參閱此[博客文章](https://blogs.msdn.microsoft.com/dotnet/2017/05/12/announcing-ef-core-2- 0-preview-1 /) – Tseng

+0

@Tseng連接不被重新使用。每次注入新的DbContext時都會調用此方法。 - 每個網絡請求1個。 幸運的是,這些連接似乎被正確地垃圾收集。所以,最後,我不知道在垃圾收集發生之前,如果不調用dispose/close,它是否是一個問題。 – sroll

+0

您是否找到解決方案?如果EF Core上下文已經打開,那麼我的連接沒有被EF Core上下文關閉。在我的情況下,我不能在選項對象中關閉它,因爲我需要在分片環境中進行連接,這就是我如何從ShardMap對象的OpenConnectionForKey方法接收它。 –

回答

1

我從布里斯LAMBSON回答誰在EF核心團隊的工作原理:

你會在正確的方向 - 開放連接更少。請記住, SQLite連接基本上只是文件流,因此保持它們更長的時間不是真正的問題。

如果有每個連接永遠只能一個的DbContext例如, 的DbContext仍然可以擁有即使它的創建 外部的連接。只需在DbContext.Dispose()中放置連接即可。

如果這還不夠,可以嘗試創建連接池。 管理生命可能會變得棘手。重要的是, 連接不會在創建線程之外使用。

使用高速緩存=共享(即Shared-Cache Mode)也可能有助於 吞吐量。