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

时间:2017-09-06 18:45:07

标签: sql entity-framework-core in-memory-database

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

这里是测试的Startup类:

// 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脚本的常用测试策略?

3 个答案:

答案 0 :(得分:5)

你没有希望,因为InMemory提供者是NoSQL非关系提供者。您应该使用SQL Server(例如localdb)进行集成测试

答案 1 :(得分:1)

您已经发现内存提供程序无法执行关系操作(合理的限制)。

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

答案 2 :(得分:0)

相反,您可以使用Inlite DB来使用SQL lite,该SQL Lite与sql兼容,并且像在内存数据库中一样非常容易设置。

https://docs.microsoft.com/en-us/ef/core/miscellaneous/testing/sqlite