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