Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架数据库更新,但数据库上下文不显示更新_C#_Entity Framework_Unit Testing_Entity Framework 6_Identityserver4 - Fatal编程技术网

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

C# 实体框架数据库更新,但数据库上下文不显示更新,c#,entity-framework,unit-testing,entity-framework-6,identityserver4,C#,Entity Framework,Unit Testing,Entity Framework 6,Identityserver4,我有以下设置: 使用EF6的NetCore Web API用于IdentityServer 4 测试API的单元测试项目 DB上下文是从web主机的服务检索的,因此应该是一个单例和相同的引用 通过以下步骤解决我的问题: 在测试之前,我用一个资源和一些声明填充数据库 单元测试发出HTTP DELETE请求,该请求导致声明被删除。这在数据库中是可见的,即上下文。调用SaveChanges() 然后,单元测试断言声明已使用DB上下文删除。由于上下文似乎未更新,此操作失败 问题是单元测试中的EFDB

我有以下设置:

  • 使用EF6的NetCore Web API用于IdentityServer 4
  • 测试API的单元测试项目
  • DB上下文是从web主机的服务检索的,因此应该是一个单例和相同的引用
通过以下步骤解决我的问题:

  • 在测试之前,我用一个资源和一些声明填充数据库
  • 单元测试发出HTTP DELETE请求,该请求导致声明被删除。这在数据库中是可见的,即
    上下文。调用SaveChanges()
  • 然后,单元测试断言声明已使用DB上下文删除。由于上下文似乎未更新,此操作失败
  • 问题是单元测试中的EFDB上下文似乎没有看到API的DB上下文所做声明的删除

    我尝试过的事情:

    • 使用web主机服务使用
      \u host.services.GetServices().First(service=>service.GetType()==typeof(ConfigurationDbContext))
      检索数据库上下文。
      • 我已通过运行检查,确认服务中只存在一个ConfigurationDbContext
    • 使用
      context.entry(resource).Reload()
      重新加载单元测试的上下文资源条目
    • 从web主机重新检索上下文
    意见:

    • 单元测试的上下文在删除之前似乎是最新的
    • 删除资源而不是它的一个声明似乎是由单元测试的上下文跟踪的
    • DB与预期的一样,因此测试中的代码似乎与预期的一样工作—只是单元测试的上下文没有更新
    • 单步执行时,API中的DB上下文在
      context.SaveChanges()调用前后进行更新
    问题:

    • 是否有人遇到EF DB上下文不更新的问题
    • 是否有我缺少的硬刷新方法会强制重新评估上下文相对于引用数据库的状态
    • 是否有某种缓存使单元测试的DB上下文相信它是最新的

    非常感谢。

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


    再次感谢。

    我不明白您为什么在这里使用单例模式。如果在生产web应用程序中只有一个DbContext派生子类的实例,那么最终会有多个线程访问同一个DbContext,这是行不通的。DbContext的每个实例都表示该特定请求对数据所做的更改。DbContext不应该更新,因为它们不应该存在太长时间,其他事务会干扰它们(DbContext不是线程安全的)。它们将用于单个工作单元,这可能会解释您的问题。非常感谢双方的澄清。只是为了确认我的问题是因为我使用的是相同的上下文,并且不能期望在测试项目和测试中的代码之间进行更新?在这种情况下,我需要获得一个引用同一数据库的数据库上下文的新实例?