在一個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()
方法現在是相當昂貴的。
這個解決方案的問題是我的連接永遠不會被處理也不會關閉!
- 將加密密鑰設置爲Open是否正確?
- 有沒有辦法知道上下文何時處置?或者將其配置爲在處理後關閉並處理連接?
- 是否有另一種更好的方式來管理連接?
骯髒的解決方案將配置連接在EF上下文Dispose方法,但我真的不想處置被注入和不屬於上下文的依賴。
它的設計,如果我正確地理解你的問題。 '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
@Tseng連接不被重新使用。每次注入新的DbContext時都會調用此方法。 - 每個網絡請求1個。 幸運的是,這些連接似乎被正確地垃圾收集。所以,最後,我不知道在垃圾收集發生之前,如果不調用dispose/close,它是否是一個問題。 – sroll
您是否找到解決方案?如果EF Core上下文已經打開,那麼我的連接沒有被EF Core上下文關閉。在我的情況下,我不能在選項對象中關閉它,因爲我需要在分片環境中進行連接,這就是我如何從ShardMap對象的OpenConnectionForKey方法接收它。 –