【发布时间】:2022-03-16 21:53:35
【问题描述】:
因此,我们在使用 MediatR 的应用程序中使用了 CQRS 模式。我正在开发一个基本的 CRUD API,具有以下规定:
- GET 调用需要使用 QueryHandlers、Dapper、SQL 从数据库中检索数据。
- PUT/POST/DELETE 调用需要使用 CommandHandlers/Entity Framework 来修改数据库。
此时我已经按预期工作了。但是,我发现测试是一场噩梦,因为我无法确定访问内存数据库所需的连接字符串。
我已经尝试过connectionString = "Data Source=:memory:;Mode=Memory;Cache=Shared"; 以及这些值的各种排列,但没有任何工作。
我看过 SQLite,但它不喜欢我尝试在启动时注册两个不同的数据库(用于读取的 SQLite 和用于写入的 Microsoft.EntityFrameworkCore.InMemory),我试图获取的对象也具有主键bigint/long 和 SQLite 似乎只能处理 integer/int 类型的主键,因为它会抛出“只有整数类型的主键可以具有自动增量”。
我正在使用类似于以下的代码设置 XUnit 测试:
public class CustomWebApplicationFactory<TStartup> : WebApplicationFactory<TStartup> where TStartup : class
{
protected override void ConfigureWebHost(IWebHostBuilder builder)
{
builder.ConfigureServices(svcs =>
{
services.AddDbContextPool<MyDbContext>(opts =>
{
options.UseInMemoryDatabase("MyTestDB");
});
using var scope = svcs.BuildServiceProvider().CreateScope();
var scopedSvcs = scope.ServiceProvider;
var dbSvc = scopedSvcs.GetRequiredService<MyDbContext>();
dbSvc.Database.EnsureCreated();
// Do DB Seeding stuff
});
}
}
在查询处理程序中,我使用SqlConnection,如下所示:
public class GetModelHandler : IRequestHandler<GetModelRequest, MyModel>
{
private readonly string _connString;
public GetModelHandler(string connString) { _connString = connString; }
public async Task<MyModel> Handle(GetModelRequest req, CancellationToken token)
{
using (var conn = new SqlConnection(_connectionString))
{
conn.Open();
// set command info and make call
}
}
}
所以,TL;DR 的问题是......“是否有一个连接字符串可用于访问 Entity Framework Core In-Memory DB,如果有,我该如何找到它?”
【问题讨论】:
-
@atiyar 我很确定这个问题是尽可能具体的。您确实需要一个连接字符串才能使用 SqlConnection/IDbConnection 连接到数据库。我想知道如何找到内存数据库的连接字符串,以便我可以使用 SqlConnection 而不是 EF 来访问它。
-
@atiyar,您在发表评论之前阅读了问题吗?
标签: c# testing entity-framework-core xunit