You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core xUnit集成测试中SQLite内存库与控制器不共享问题

.NET集成测试SQLite内存数据库不共享问题解决方案

核心问题

SQLite内存数据库的特性是每个新连接都会创建独立的内存实例,即便连接字符串相同。你测试中虽将连接注册为单例,但测试通过factory.Services获取的UserManager与控制器请求时初始化的DbContext,实际使用了不同的连接实例,导致数据无法共享。

解决步骤

1. 强制所有组件复用同一个SQLite连接

在测试的WebApplicationFactory配置中,不仅要注册连接单例,还要确保DbContext和Identity组件都绑定到这个连接:

// 创建内存连接并保持打开(关闭会丢失数据)
var sqliteConnection = new SqliteConnection("Data Source=:memory:");
sqliteConnection.Open();

builder.Services.AddDbContext<InvoicerDbContext>(options =>
{
    options.UseSqlite(sqliteConnection);
});

// 覆盖Identity内部的DbContext配置,确保UserManager用同一个连接
builder.Services.AddOptions<DbContextOptions<InvoicerDbContext>>()
    .Configure(options => options.UseSqlite(sqliteConnection));

2. 统一连接初始化时机

不要在测试方法中重复创建连接,应在WebApplicationFactory的ConfigureWebHost方法中统一配置,保证整个测试周期内仅使用一个连接实例。

3. 验证连接复用效果

可通过对比哈希值确认连接实例一致:

// 测试类中获取DbContext的连接哈希
var testDbContext = factory.Services.GetRequiredService<InvoicerDbContext>();
var testConnectionHash = testDbContext.Database.GetDbConnection().GetHashCode();

// 控制器中输出自身DbContext的连接哈希,与测试类的哈希值对比

关键注意事项

  • SQLite内存数据库必须保持连接打开状态,连接关闭后数据会立即销毁。
  • 使用AddIdentityApiEndpoints时,Identity内部会自动创建DbContext实例,必须显式绑定到共享连接,否则UserManager会访问独立的内存库。
  • 文件型SQLite无此问题,因为数据存储在磁盘文件中,不同连接可共享同一数据源。

内容的提问来源于stack exchange,提问作者Aivaras Kriksciunas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 05:06:02