多个数据库上下文到一个数据库

问题描述

我正在内存数据库中使用EF进行一些单元测试。我已经弄清楚了如何用一些测试数据填充数据库以及如何通过上下文查询结果。问题是我有两个数据库上下文。一种用于将数据添加到表中,另一种具有用于访问数据的视图。我不知道如何创建两个上下文,以便它们使用相同的数据库。我的单元测试返回失败,因为它预期结果为1但找到0。

有什么建议吗?

[Fact]
public void WhenCallingA_ThenCallReturnThis()
{
    var tableOptions = new DbContextOptionsBuilder<TableContext>()
        .UseInMemoryDatabase(databaseName: "MyDatabase")
        .Options;

    var viewOptions = new DbContextOptionsBuilder<ViewContext>()
        .UseInMemoryDatabase(databaseName: "MyDatabase")
        .Options;

    using (var tableContext = new TableContext(tableOptions))
    {
        tableContext.MyTable.Add(GenerateRecord());
        tableContext.SaveChanges();
    }

    using (var viewContext = new ViewContext(viewOptions))
    {
        Assert.Equal("HelloWorld",viewContext.MyTopics.Find(12).name);
    }
}

解决方法

使用InMemory数据库时,不能使用视图。使用InMemory数据库时,我们无法创建视图。视图只是SQL语句的结果。视图是非常特定于数据库的。实体框架将视图视为另一个实体。

因此,当您使用InMemory数据库时。 MyTopics视图实体和MyTable实体在内存中表示为两个单独的表。查询MyTable时,将数据填充到MyTopics中不会获取任何结果。

相反,您可以通过以下方式重构测试:

[Fact]
public void WhenCallingA_ThenCallReturnThis()
{
    var tableOptions = new DbContextOptionsBuilder<TableContext>()
        .UseInMemoryDatabase(databaseName: "MyDatabase")
        .Options;

    using (var tableContext = new TableContext(tableOptions))
    {
        tableContext.MyTable.Add(GenerateRecord());
        tableContext.SaveChanges();
    }

    using (var tableContext = new TableContext(tableOptions))
    {
        Assert.Equal(1,tableContext.MyTable.Count());
    }
}