我有以下设置:
- 为 IdentityServer4 使用 EF6 的 .NetCore Web API。
- 测试 API 的单元测试项目。
- 数据库上下文是从 Web 主机的服务中检索的,因此应该是一个单例和相同的引用。
通过以下步骤导致我的问题:
- 在测试之前,我用资源和一些声明填充数据库。
- 单元测试发出 HTTP DELETE 请求,导致声明被删除。这在数据库中显示为
context.SaveChanges()
被称为。 - 然后单元测试使用数据库上下文断言声明已被删除。由于上下文似乎没有更新而失败。
问题是单元测试中的 EF DB 上下文似乎没有看到删除 API 的数据库上下文所做的声明。
我尝试过的事情:
- 使用网络主机服务通过
_host.Services.GetServices<ConfigurationDbContext>().First(service => service.GetType() == typeof(ConfigurationDbContext))
检索数据库上下文.- 我通过运行检查过服务中只存在一个 ConfigurationDbContext。
- 使用
context.Entry(resource).Reload()
重新加载单元测试的上下文资源条目. - 从网络主机重新检索上下文。
观察:
- 单元测试的上下文在删除之前似乎是最新的。
- 删除资源而不是其声明之一似乎由单元测试的上下文跟踪。
- 数据库符合预期,因此被测代码似乎按预期工作,只是单元测试的上下文没有更新。
- 单步执行时 API 中的数据库上下文正在更新导致
context.SaveChanges()
之后。打电话。
问题:
- 有人遇到过 EF DB 上下文不更新的问题吗?
- 是否有一种我缺少的硬刷新方法会强制重新评估与引用数据库相关的上下文状态?
- 是否有某种缓存使单元测试的数据库上下文相信它是最新的。
非常感谢。
最佳答案
感谢 Eric J 和 DevilSuichiro 帮助我解决了我的问题。问题是我不应该尝试使用相同的数据库上下文。通过检索新的数据库上下文而不是尝试重用相同的数据库上下文,我能够验证我的测试结果。
再次感谢。
关于c# - Entity Framework 数据库更新但数据库上下文未显示更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52594481/