SQLite を使用した EF Core アプリケーションのテストUsing SQLite to test an EF Core application

警告

SQLite を使用すると、EF Core アプリケーションをテストする効果的な方法になります。Using SQLite can be an effective way to test an EF Core application. ただし、SQLite の動作が他のデータベースシステムと異なる場合は、問題が発生する可能性があります。However, problems can arise where SQLite behaves differently from other database systems. 問題とトレードオフの詳細については、「 EF Core を使用したコードのテスト 」を参照してください。See Testing code that uses EF Core for a discussion of the issues and trade-offs.

このドキュメントでは、 EF Core を使用するアプリケーションのテスト方法を示すサンプルで導入された概念について説明します。This document builds uses on the concepts introduced in Sample showing how to test applications that use EF Core. このサンプルのコード例を次に示します。The code examples shown here come from this sample.

SQLite インメモリデータベースの使用Using SQLite in-memory databases

通常、SQLite は単純なファイルとしてデータベースを作成し、アプリケーションでインプロセスのファイルにアクセスします。Normally, SQLite creates databases as simple files and accesses the file in-process with your application. これは、特に高速 SSDを使用する場合には非常に高速です。This is very fast, especially when using a fast SSD.

SQLite では、単にメモリ内で作成されたデータベースを使用することもできます。SQLite can also use databases created purely in-memory. これは、インメモリデータベースの有効期間を理解していれば、EF Core で簡単に使用できます。This is easy to use with EF Core as long as you understand the in-memory database lifetime:

  • データベースへの接続が開かれると、データベースが作成されます。The database is created when the connection to it is opened
  • データベースへの接続が閉じられると、データベースは削除されます。The database is deleted when the connection to it is closed

指定されている場合、既に開いている接続が使用されるため、EF Core は閉じようとしません。EF Core will use an already open connection when given one, and will never attempt to close it. そのため、メモリ内の SQLite データベースで EF Core を使用するには、EF に渡す前に接続を開く必要があります。So the key to using EF Core with an in-memory SQLite database is to open the connection before passing it to EF.

この サンプル では、次のコードを使用してこれを実現します。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();
}

注意:Notice:

  • メソッドは、 CreateInMemoryDatabase SQLite メモリ内データベースを作成し、そのデータベースへの接続を開きます。The CreateInMemoryDatabase method creates a SQLite in-memory database and opens the connection to it.
  • 作成されたはから抽出され、 DbConnection ContextOptions 保存されます。The created DbConnection is extracted from the ContextOptions and saved.
  • リソースがリークしないようにテストが破棄されると、接続は破棄されます。The connection is disposed when the test is disposed so that resources are not leaked.

注意

問題 #16103 は、この接続管理を容易にする方法を追跡することです。Issue #16103 is tracking ways to make this connection management easier.