实体框架数据库更新,但数据库上下文未显示更新

时间:2018-10-01 15:38:06

标签: c# entity-framework unit-testing entity-framework-6 identityserver4

我有以下设置:

  • 使用EF6的IdentityServer4的.NetCore Web API。
  • 用于测试API的单元测试项目。
  • 从Web主机的服务中检索
  • DB上下文,因此应该是单例并且具有相同的引用。

通过以下步骤导致我的问题:

  1. 在进行测试之前,我先向数据库填充资源和一些声明。
  2. 单元测试发出HTTP DELETE请求,该请求导致删除声明。这在数据库中可见,称为context.SaveChanges()
  3. 然后,单元测试断言已使用数据库上下文删除了声明。由于上下文似乎未更新,此操作失败。

问题在于,单元测试中的EF DB上下文似乎看不到API的DB上下文提出的声明的删除。

我尝试过的事情:

  • 使用的Web主机服务使用_host.Services.GetServices<ConfigurationDbContext>().First(service => service.GetType() == typeof(ConfigurationDbContext))检索数据库上下文。
    • 通过运行检查,我发现服务中仅存在一个ConfigurationDbContext。
  • 使用context.Entry(resource).Reload()重新加载单元测试的上下文资源条目。
  • 从Web主机重新获取上下文。

观察:

  • 单元测试的上下文似乎是最新的,然后才删除。
  • 单元测试的上下文似乎可以跟踪删除资源而不是其声明之一。
  • 数据库符合预期,因此被测代码似乎按预期工作,只是单元测试的上下文未更新。
  • 逐步执行时,API中的数据库上下文正在更新,导致context.SaveChanges()调用前后发生。

问题:

  • 有人遇到EF DB上下文不更新的问题吗?
  • 我是否缺少一种硬刷新方法,该方法会强制对所引用的DB进行上下文状态的重新评估?
  • 是否存在某种某种类型的缓存,使得单元测试的DB上下文认为它是最新的。

非常感谢。

1 个答案:

答案 0 :(得分:1)

感谢Eric J和DevilSuichiro都帮助我解决了我的问题。问题是我不应该尝试使用相同的数据库上下文。通过检索新的数据库上下文,而不是尝试重用相同的数据库上下文,我能够验证测试结果。

再次感谢。

相关问题