使用 SQLite 测试 EF Core 应用程序Using SQLite to test an EF Core application

警告

使用 SQLite 可以有效地测试 EF Core 应用程序。 但是,当 SQLite 的行为与其他数据库系统不同时,可能会出现问题。 有关问题和利弊权衡的讨论,请参阅使用 EF Core 的测试代码

本文档在示例中所述的概念上生成了如何测试使用 EF Core 的应用程序。 此处所示的代码示例来自于此示例。

使用 SQLite 内存中数据库Using SQLite in-memory databases

通常情况下,SQLite 以简单文件的形式创建数据库,并在应用程序中访问文件。 这种速度非常快,尤其是在使用快速SSD时。

SQLite 还可以使用纯粹在内存中创建的数据库。 只要了解内存中数据库生存期,就可以轻松地在 EF Core 中使用:

  • 当打开数据库的连接时,将创建该数据库
  • 当数据库的连接关闭时,将删除该数据库

EF Core 将在给定连接时使用已打开的连接,并且不会尝试关闭该连接。 因此,将 EF Core 用于内存中 SQLite 数据库的关键是在将连接传递给 EF 之前打开连接。

示例通过以下代码实现此操作:

  1. public class SqliteInMemoryItemsControllerTest : ItemsControllerTest, IDisposable
  2. {
  3. private readonly DbConnection _connection;
  4. public SqliteInMemoryItemsControllerTest()
  5. : base(
  6. new DbContextOptionsBuilder<ItemsContext>()
  7. .UseSqlite(CreateInMemoryDatabase())
  8. .Options)
  9. {
  10. _connection = RelationalOptionsExtension.Extract(ContextOptions).Connection;
  11. }
  12. private static DbConnection CreateInMemoryDatabase()
  13. {
  14. var connection = new SqliteConnection("Filename=:memory:");
  15. connection.Open();
  16. return connection;
  17. }
  18. public void Dispose() => _connection.Dispose();
  19. }

通知

  • CreateInMemoryDatabase方法创建一个 SQLite 内存中数据库,并打开与该数据库的连接。
  • 创建DbConnection的从中提取ContextOptions ,并保存。
  • 当释放测试以便不泄漏资源时,将释放该连接。

备注

问题 #16103正在跟踪使此连接管理更容易的方法。