In un progetto di base asp.net, ho bisogno di un database SQLite crittografato. Per questo, ho creato il mio SqliteEncryptedConnection
che eredita da Microsoft.Data.Sqlite.SqliteConnection
e che imposta la chiave di crittografia nel metodo Open()
(esegui PRAGMA key = ...)
Ho un metodo di estensione che configura il mio contesto EF creando una connessione e assegnandola.
public static void UseEncryptedSqlite(this DbContextOptionsBuilder optionsBuilder, string connectionString, string password)
{
var connection = new SqliteEncryptedConnection(connectionString, password);
connection.Open();
optionsBuilder.UseSqlite(connection);
}
Devo aprire la connessione prima di assegnarla a EF, altrimenti viene automaticamente aperta e chiusa da EF per ogni singola query e il metodo Open()
ora è piuttosto costoso.
Il mio problema con questa soluzione è che la mia connessione non viene mai eliminata né chiusa!
La soluzione sporca sarebbe quella di smaltire la connessione nel metodo Dispose del contesto EF, ma in realtà non voglio disporre di una dipendenza che è stata iniettata e non è di proprietà del contesto.
Ho avuto una risposta da Brice Lambson che lavora nel core team EF:
Stai andando nella giusta direzione - apri le connessioni di meno. Ricorda, le connessioni SQLite sono essenzialmente solo flussi di file, quindi tenerle aperte più a lungo non è davvero un problema.
Se esiste sempre una sola istanza DbContext per connessione, DbContext può ancora possedere la connessione anche se è stata creata esternamente. Basta disporre la connessione all'interno di DbContext.Dispose ().
Se ciò non è sufficiente, puoi provare a creare un pool di connessioni. Gestire la vita potrebbe essere complicato. L'importante è che una connessione non venga utilizzata al di fuori del thread su cui è stata creata.
Anche l'uso di Cache = Shared (ad es. Shared-Cache Mode ) potrebbe essere d'aiuto.