Verwenden von SQLite zum Testen einer EF Core AnwendungUsing SQLite to test an EF Core application

Warnung

Die Verwendung von SQLite kann eine effektive Möglichkeit zum Testen einer EF Core Anwendung sein.Using SQLite can be an effective way to test an EF Core application. Es können jedoch Probleme auftreten, wenn SQLite anders als andere Datenbanksysteme verhält.However, problems can arise where SQLite behaves differently from other database systems. Eine Erläuterung der Probleme und Kompromisse finden Sie unter Testen von Code, der EF Core verwendet .See Testing code that uses EF Core for a discussion of the issues and trade-offs.

In diesem Dokument werden die im Beispiel eingeführten Konzepte verwendet, die veranschaulichen, wie Sie Anwendungen testen, die EF Core verwenden.This document builds uses on the concepts introduced in Sample showing how to test applications that use EF Core. Die hier gezeigten Codebeispiele stammen aus diesem Beispiel.The code examples shown here come from this sample.

Verwenden von sqlite-in-Memory-DatenbankenUsing SQLite in-memory databases

Normalerweise erstellt SQLite Datenbanken als einfache Dateien und greift mit Ihrer Anwendung Prozess bedingt auf die Datei zu.Normally, SQLite creates databases as simple files and accesses the file in-process with your application. Dies ist sehr schnell, insbesondere bei Verwendung einer schnellen SSD.This is very fast, especially when using a fast SSD.

SQLite kann auch Datenbanken verwenden, die ausschließlich im Arbeitsspeicher erstellt wurden.SQLite can also use databases created purely in-memory. Dies ist mit EF Core leicht zu verwenden, solange Sie die in-Memory Database Lebensdauer verstehen:This is easy to use with EF Core as long as you understand the in-memory database lifetime:

  • Die Datenbank wird erstellt, wenn die Verbindung mit ihr geöffnet wird.The database is created when the connection to it is opened
  • Die Datenbank wird gelöscht, wenn die Verbindung mit der Datenbank geschlossen wird.The database is deleted when the connection to it is closed

EF Core wird eine bereits geöffnete Verbindung verwendet, wenn eine vorhanden ist, und versucht nie, Sie zu schließen.EF Core will use an already open connection when given one, and will never attempt to close it. Der Schlüssel für die Verwendung von EF Core mit einer in-Memory SQLite-Datenbank besteht also darin, die Verbindung zu öffnen, bevor Sie Sie an EF übergibt.So the key to using EF Core with an in-memory SQLite database is to open the connection before passing it to EF.

Das Beispiel erreicht dies mit folgendem Code:The sample achieves this with the following code:

public class SqliteInMemoryItemsControllerTest : ItemsControllerTest, IDisposable
{
    private readonly DbConnection _connection;

    public SqliteInMemoryItemsControllerTest()
        : base(
            new DbContextOptionsBuilder<ItemsContext>()
                .UseSqlite(CreateInMemoryDatabase())
                .Options)
    {
        _connection = RelationalOptionsExtension.Extract(ContextOptions).Connection;
    }

    private static DbConnection CreateInMemoryDatabase()
    {
        var connection = new SqliteConnection("Filename=:memory:");

        connection.Open();

        return connection;
    }

    public void Dispose() => _connection.Dispose();
}

Beachten Sie Folgendes:Notice:

  • Die CreateInMemoryDatabase -Methode erstellt eine sqlite-in-Memory Database und öffnet die Verbindung mit der-Methode.The CreateInMemoryDatabase method creates a SQLite in-memory database and opens the connection to it.
  • Der erstellte DbConnection wird aus der extrahiert ContextOptions und gespeichert.The created DbConnection is extracted from the ContextOptions and saved.
  • Die Verbindung wird verworfen, wenn der Test verworfen wird, damit Ressourcen nicht verloren gehen.The connection is disposed when the test is disposed so that resources are not leaked.

Hinweis

Problem #16103 ist das Nachverfolgen von Möglichkeiten, diese Verbindungs Verwaltung zu vereinfachen.Issue #16103 is tracking ways to make this connection management easier.