微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决多个数据库上下文到一个数据库

我正在内存数据库中使用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());
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。