【问题标题】:Multi-Context InMemory Database多上下文 InMemory 数据库
【发布时间】:2018-01-25 07:18:47
【问题描述】:

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

【问题讨论】:

  • 同名就够了。

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


【解决方案1】:

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

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

//using Microsoft.EntityFrameworkCore.Storage;
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

【讨论】:

  • 也在 DNCore 3.1 上进行了验证。供未来读者使用的完整命名空间/对象和明确的成员变量名称:private static readonly Microsoft.EntityFrameworkCore.Storage.InMemoryDatabaseRoot InMemoryDatabaseRootInstance = new InMemoryDatabaseRoot();
  • 但是谢谢。我已经在一个项目中转移到 CQSR 模式(将命令(在 CRUD 中创建/更新/删除)与查询(读取 CRUD)分开,这是我的单元测试失败的唯一地方.. .因为我有一个常规上下文和一个只读上下文。我需要常规上下文和只读上下文来共享同一个 InMemoryDatabase。
【解决方案2】:

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

EF Core 2.0 甚至在同名的内存数据库中重复使用:

内存数据库必须命名

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

optionsBuilder.UseInMemoryDatabase("MyDatabase"); 

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

【讨论】:

  • 我发现在继承的 DBContext 及其基类使用相同的名称时,这是一个问题,它们有不同的数据。这将是由于@Jens 回答模型必须相同
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2017-10-19
    • 2014-04-17
    • 1970-01-01
    • 2019-01-25
    • 2022-01-02
    • 1970-01-01
    • 2021-11-30
    • 2016-12-17
    • 2020-04-23
    相关资源
    最近更新 更多