使用AspNetCore.TestHost和EntityFrameworkCore.InMemory丢失数据

问题描述 投票:2回答:1

我正在尝试为使用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()后打印出数据库的内容,并确认正在保存该对象。但是,当我的存储库对象尝试检索注入的MyDbContext对象中的所有类别时,它会显示没有类别存在。

我尝试了各种配置无济于事。使用不在内存中的数据库工作正常,所以我确信有一些我缺少的东西。这让我很生气,所以任何帮助都会非常感激!

c# .net-core entity-framework-core in-memory-database asp.net-core-testhost
1个回答
1
投票

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

    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
}
© www.soinside.com 2019 - 2024. All rights reserved.