多上下文内存数据库

时间:2018-01-25 07:18:47

标签: c# entity-framework testing asp.net-core entity-framework-core

是否可以拥有跨多个DbContexts共享的InMemory数据库(ASP.NET Core)?似乎每个DbContext类型都保留自己的数据库,即使在UseInMemoryDatabase中指定了相同的数据库名称。

3 个答案:

答案 0 :(得分:3)

同名就足够了。如果您的DbContext实例在内存数据库中没有“看到”相同的内容,则它们似乎使用具有不同名称的实例。确保为同一名称创建一次DbContext。

EF Core 2.0甚至可以在具有相同名称的内存数据库中重复使用:

  

内存数据库必须命名为

     

已删除全局未命名的内存数据库,而必须命名所有内存数据库。例如:

optionsBuilder.UseInMemoryDatabase("MyDatabase"); 
  

这创建/使用a   名为“MyDatabase”的数据库。 如果再次使用相同名称调用UseInMemoryDatabase,则将使用相同的内存数据库,允许多个上下文实例共享它。

答案 1 :(得分:1)

除了相同的数据库名称,模型也必须相同。 这意味着在自己实现IModelCacheKeyFactory的情况下,它的Create-Method必须返回" equal"对象。

答案 2 :(得分:1)

如今这是可行的,但是如果您使用其他上下文类型,仅传递名称确实是不够的。我正在使用.net core 2.2,并且出现了完全相同的问题。我的代码现在如下所示:

我在类级别创建了一个这样的InMemoryDatabaseRoot对象

private static readonly InMemoryDatabaseRoot InMemoryDatabaseRoot = new InMemoryDatabaseRoot();

当我添加数据库上下文时,我传递了根实例

services.AddDbContext<MyContext>(options =>
{
    options.UseInMemoryDatabase("MyContext", InMemoryDatabaseRoot);
    options.UseInternalServiceProvider(serviceProvider);
 });

 services.AddDbContext<MySecondContext>(options =>
 {
    options.UseInMemoryDatabase("MyContext", InMemoryDatabaseRoot);
    options.UseInternalServiceProvider(serviceProvider);
  });

我在这里的讨论中找到了它:https://github.com/aspnet/EntityFrameworkCore/issues/9613#issuecomment-430722420