gpt4 book ai didi

c# - 将 AspNetCore.TestHost 与 EntityFrameworkCore.InMemory 一起使用丢失数据

转载 作者:太空宇宙 更新时间:2023-11-03 12:19:50 25 4
gpt4 key购买 nike

我正在尝试为我使用 graphql-dotnet 的小型 GraphQL 服务器编写集成测试。当我使用我的 Web 应用程序时,服务器工作正常。

为了运行集成测试,我尝试使用 Microsoft.AspNetCore.TestHost 来配置服务器并发送 POST 请求。我还尝试使用 Microsoft.EntityFrameworkCore.InMemory 来使用内存数据库而不是本地运行的“真实”数据库。

我有一个 TestStartUp.cs 文件,它设置内存数据库并尝试保存单个记录:

public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();

services.AddDbContext<MyDbContext>(options =>
options.UseInMemoryDatabase()
);

...
}

public void Configure(
IApplicationBuilder app,
IHostingEnvironment env,
MyDbContext myDbContext)
{
myDbContext.Categories.Add(new Category {Id = 1, Name = "Category 1" });
myDbContext.SaveChanges();
app.UseMvc();
}

我在调用 SaveChanges() 后打印出数据库的内容,并确认正在保存该对象。但是,当我的存储库对象尝试检索注入(inject)的 MyDbContext 对象中的所有类别时,它显示不存在任何类别。

我试过各种配置都无济于事。使用不在内存中的数据库可以正常工作,所以我确定我遗漏了什么。这让我发疯,所以非常感谢任何帮助!

最佳答案

为了在少数地方使用 InMemoryDatabase,您需要每次都提供相同的数据库选项(使用相同的数据库)。看看下面:

    protected DbContextOptions<BackofficeContext> GetDbContextOptions()
{
return new DbContextOptionsBuilder<BackofficeContext>().UseInMemoryDatabase(NAME_OF_YOUR_IN_MEMORY_DATABASE).Options;
}

然后你可以做类似的事情:

var databaseOptions = GetDbContextOptions();

using (var context = new MyContext(databaseOptions))
{
//Add some data to the database
context.SaveChanges();
}

using (var context = new MyContext(databaseOptions))
{
//Recieve data from the database
}

关于c# - 将 AspNetCore.TestHost 与 EntityFrameworkCore.InMemory 一起使用丢失数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47934268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com