具有相同名称的多个内存数据库

时间:2019-01-15 06:54:19

标签: c# .net-core ef-core-2.2

关于this answer,我正在尝试通过将UseInMemoryDatabase设置为相同的名称来使多个上下文正常工作。下面的测试失败,并且secondContext为空。

我还需要做些什么来共享内存数据库中的相同内容?

[Test]
public void MultipleContextTest()
{
    var firstContext = new FirstContext(new DbContextOptionsBuilder<FirstContext>().UseInMemoryDatabase("DB").Options);
    firstContext.Add(new Entity() {Name = "Test"});
    firstContext.SaveChanges();

    var secondContext = new SecondContext(new DbContextOptionsBuilder<SecondContext>().UseInMemoryDatabase("DB").Options);

    Assert.AreEqual(1, secondContext.Entity.Count());
}

public class FirstContext : DbContext
{
    public DbSet<Entity> Entity { get; set; }

    public FirstContext(DbContextOptions options) : base(options)
    {

    }
}

public class SecondContext : DbContext
{
    public DbSet<Entity> Entity { get; set; }

    public SecondContext(DbContextOptions options) : base(options)
    {

    }
}

public class Entity
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
}

1 个答案:

答案 0 :(得分:0)

我通过在所有上下文中将InMemoryDatabaseRoot设置为相同的对象来使其工作。

private InMemoryDatabaseRoot _root;
private InMemoryDatabaseRoot Root
{
    get
    {
        if(_root == null)
            _root = new InMemoryDatabaseRoot();

        return _root;
    }
}

[Test]
public void MultipleContextTest()
{
    var firstContext = new FirstContext(CreateOptions<FirstContext>());
    firstContext.Add(new Entity() {Name = "Test"});
    firstContext.SaveChanges();

    var secondContext = new SecondContext(CreateOptions<SecondContext>());


    Assert.AreEqual(firstContext.Entity.Count(), secondContext.Entity.Count());
}

private DbContextOptions CreateOptions<T>() where T : DbContext
{
    return new DbContextOptionsBuilder<T>()
        .UseInMemoryDatabase("DB", Root)
        .Options;
}