使用AspnetCore.testHost与EntityFrameWorkCore.inmemory丢失数据



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

要运行集成测试,我正在尝试使用microsoft.aspnetcore.testhost配置服务器并发送邮政请求。我还尝试使用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对象中的所有类别时,它表明不存在类别。

我已经尝试了各种配置。使用不在内存中的数据库工作正常,所以我敢肯定我缺少一些东西。这让我发疯了,所以任何帮助都将不胜感激!

为了在几个地方使用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
}

最新更新