C# 将多个数据库上下文连接到单个数据库

C# 将多个数据库上下文连接到单个数据库,c#,asp.net,entity-framework-core,in-memory-database,C#,Asp.net,Entity Framework Core,In Memory Database,我正在使用EF内存数据库做一些单元测试。我已经了解了如何用一些测试数据填充数据库,以及如何通过上下文查询结果。问题是我有两个db上下文。一个用于向表中添加数据,另一个带有用于访问数据的视图。我不知道如何创建这两个上下文,以便它们使用相同的数据库。我的单元测试返回失败,因为它预期结果为1,但找到0 有什么建议吗 [Fact] public void WhenCallingA_ThenCallReturnThis() { var tableOptions = new DbContextOpt

我正在使用EF内存数据库做一些单元测试。我已经了解了如何用一些测试数据填充数据库,以及如何通过上下文查询结果。问题是我有两个db上下文。一个用于向表中添加数据,另一个带有用于访问数据的视图。我不知道如何创建这两个上下文,以便它们使用相同的数据库。我的单元测试返回失败,因为它预期结果为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);
    }
}
[事实]
当Callinga_然后调用ReturnThis()时公共无效
{
var tableOptions=new DbContextOptionsBuilder()
.UseInMemoryDatabase(数据库名称:“MyDatabase”)
.选择;
var viewOptions=new DbContextOptionsBuilder()
.UseInMemoryDatabase(数据库名称:“MyDatabase”)
.选择;
使用(var tableContext=newtablecontext(tableOptions))
{
tableContext.MyTable.Add(GenerateRecord());
tableContext.SaveChanges();
}
使用(var viewContext=newviewcontext(viewOptions))
{
Equal(“HelloWorld”,viewContext.MyTopics.Find(12.name);
}
}

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

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

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

[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());
    }
}
[事实]
当Callinga_然后调用ReturnThis()时公共无效
{
var tableOptions=new DbContextOptionsBuilder()
.UseInMemoryDatabase(数据库名称:“MyDatabase”)
.选择;
使用(var tableContext=newtablecontext(tableOptions))
{
tableContext.MyTable.Add(GenerateRecord());
tableContext.SaveChanges();
}
使用(var tableContext=newtablecontext(tableOptions))
{
等于(1,tableContext.MyTable.Count());
}
}

上下文不同,添加了不同的选项。TableContext添加了写入数据库和读取原始列值的选项,ViewContext添加了通过视图提取列和json字段的选项。DB Context?模型的模型是否相同?两个上下文在同一个表上工作。一个直接-一个通过视图。我认为在两个上下文中使用数据库名称是不够的。您需要有一个公共服务提供程序和InMemoryDatabaseRoot。勾选这个。你链接到的答案表明这个名字应该足够了。而且服务提供商也应该是相同的。我尝试将相同的服务提供者添加到两个上下文选项中,没有任何更改。