Использование неразделенной базы данных SQLite в памяти
Базы данных SQLite в памяти по умолчанию являются временными. В документации указано :
База данных перестает существовать, как только соединение с базой данных закрывается. Every: memory: база данных отличается от всех остальных.
EF Core DbContext
, с другой стороны, всегда автоматически открывает и закрывает соединения с базой данных, если только вы не пропустили уже открытое соединение.
Поэтому, чтобы использовать одну и ту же базу данных SQLite в памяти для нескольких вызовов в EF Core, необходимо создать объект SqliteConnection
отдельно, а затем передать его каждому DbContext
.
Например:
var keepAliveConnection = new SqliteConnection("DataSource=:memory:");
keepAliveConnection.Open();
services.AddDbContext<MyContext>(options =>
{
options.UseSqlite(keepAliveConnection);
});
Обратите внимание, что SqliteConnection
на самом деле не ориентирован на многопоточность, поэтому этот подход применим только к однопоточным сценариям. Каждый раз, когда вы хотите иметь общую базу данных, к которой могут обращаться несколько потоков (например, в приложении ASP.NET Core, обслуживающем несколько запросов), вам следует рассмотреть возможность использования базы данных на диске.
Кстати, этот подход в настоящее время используется в документации EF Core о том, как использовать базы данных SQLite в памяти для тестирования .
Использование общей базы данных SQLite в памяти
SQLite также поддерживает именованные общие базы данных в памяти . Используя одну и ту же строку подключения, несколько объектов SqliteConnection
могут подключаться к одной и той же базе данных. Тем не менее:
База данных автоматически удаляется, а память восстанавливается после закрытия последнего подключения к базе данных.
Таким образом, по-прежнему необходимо поддерживать отдельный объект открытого соединения, чтобы база данных могла использоваться для нескольких вызовов EF Core. Например:
var connectionString = "DataSource=myshareddb;mode=memory;cache=shared";
var keepAliveConnection = new SqliteConnection(connectionString);
keepAliveConnection.Open();
services.AddDbContext<MyContext>(options =>
{
options.UseSqlite(connectionString);
});
Обратите внимание, что этот подход не ограничен одним потоком, потому что каждый DbContext
получает свой собственный экземпляр SqliteConnection
.