带有 EF Core 和内存数据库提供程序的原始 sql

Raw sql with EF Core and in-memory db provider

我的一个 API 路由使用原始 sql merge into 命令来执行原子更新插入操作,在我的自动化测试中我有一个 TestServer 使用内存数据库提供程序的实例。它给了我一个错误,可能是因为内存提供程序不支持 运行 原始 sql 命令 - 是这样吗?如果没有,我如何让它工作?

这是测试的 Startup class:

// In memory DB for testing
services.AddDbContext<MyContext>(optionsBuilder => optionsBuilder.UseInMemoryDatabase("stuff"));
services.AddDbContext<MyStatusContext>(optionsBuilder => optionsBuilder.UseInMemoryDatabase("status"));
services.AddDbContext<MyUserRolesContext>(optionsBuilder => optionsBuilder.UseInMemoryDatabase("userroles"));

API 代码如您所料:

var count = await context.Database.ExecuteSqlCommandAsync(@"merge into ...", default(CancellationToken), ...);
return count;

此代码在针对真实数据库的生产中运行良好,我只是无法在我的测试中使用内存中提供程序。我还有希望吗?自定义 sql 脚本的常用测试策略是什么?

您没有希望,因为 InMemory 提供程序是一个没有SQL 的非关系提供程序。您应该使用 SQL 服务器(例如 localdb)进行集成测试

如您所见,内存中提供程序无法执行关系操作(合理的限制)。

我遇到了类似的问题,最终组装了一个库来扩展内存中提供程序以支持关系操作 - EntityFrameworkCore.Testing。它会做 ExecuteSqlCommand/ExecuteSqlCommandAsync 模拟。