从内存中的多个dbcontext中检索数据



让我们假设我有以下项目结构:

解决方案
|——比;Read.User(项目)
| |--& gt;Model
| |——>User.cs
| |--& gt;
| |——>ReadUserContext.cs
|——比;Write.User(项目)
| |--& gt;Model
| |——>User.cs
| |--& gt;
| |——>WriteUserContext.cs

下面的结构允许我将对域对象进行一些更改的写模型与仅从DB获取值的读模型分开,并且还有一个重要的信息是,我不能使用ReadonlyContext保存数据,所有的SaveChanges方法都覆盖了NotImplementedException,我不会改变,因为我们的架构的保护级别。

我正在努力为以下架构创建一个测试。

现在使用InMemoryDatabase它有一些我必须克服的限制。

让我们假设测试应该看起来像:

  1. 使用Factory创建写上下文
  2. 将用户添加到WriteDbContext Users DbSet
  3. Save Changes on WriteDbContext
  4. 使用Factory创建只读上下文
  5. 从users DbSet
  6. 中检索所有用户

下面的示例将返回0个Users。为什么?首先,因为它是InMemoryDatabase我必须提供TheInMemoryDatabaseRoot让它们共享相同的数据,但接下来我遇到了最大的问题。

当我试图从ReadonlyDbContext中读取数据时,我正在使用从以下项目中的用户类创建的Users DbSet,但是我在测试的第二步中添加并保存在第三个用户上的用户DbSet上发生了在写项目中使用用户类.

InMemoryDatabase将这些dbset识别为单独的"表";在真实数据库中,它们是同一个表。

我有问题要问你们。是否有任何方法可以在InMemoryDatabase上做到这一点,或者我应该移动到真实的数据库来创建这种测试?

自2022年起,Microsoft建议使用您的生产数据库引擎而不是内存中的double。我建议您阅读关于测试核心应用程序的整个章节以获得详细信息:

https://learn.microsoft.com/en-us/ef/core/testing/

最新更新