Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.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

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# 实体框架-MultipleActiveResultSet对缓存的影响_C#_Entity Framework - Fatal编程技术网

C# 实体框架-MultipleActiveResultSet对缓存的影响

C# 实体框架-MultipleActiveResultSet对缓存的影响,c#,entity-framework,C#,Entity Framework,所以我有一个类,看起来像下面这样。有一个线程首先使用实体框架代码DbContext执行一些工作 我遇到的问题是,看起来m_DB上下文正在缓存数据,即使应该为每个处理循环处理和重新创建数据 我看到的是,关系中的一些数据在加载的模型中不存在。如果我突然终止并重新启动进程,数据就会像应该的那样被找到 我唯一能想到的是这个应用程序在数据库连接字符串中使用MultipleActiveResultSets=true,但我找不到任何明确说明这会导致我看到的行为 如有任何见解,将不胜感激 public cla

所以我有一个类,看起来像下面这样。有一个线程首先使用实体框架代码DbContext执行一些工作

我遇到的问题是,看起来m_DB上下文正在缓存数据,即使应该为每个处理循环处理和重新创建数据

我看到的是,关系中的一些数据在加载的模型中不存在。如果我突然终止并重新启动进程,数据就会像应该的那样被找到

我唯一能想到的是这个应用程序在数据库连接字符串中使用MultipleActiveResultSets=true,但我找不到任何明确说明这会导致我看到的行为

如有任何见解,将不胜感激


public class ProcessingService
{

  private MyContext m_DB = null
  private bool m_Run = true;

  private void ThreadLoop()
  {
    while(m_Run)
    {
      try
      {
        if(m_DB == null)
          m_DB = new MyContext();
      }
      catch(Exception ex)
      {
        //Log Error
      }
      finally
      {
        if(m_DB != null)
        {
          m_DB.Dispose();
          m_DB = null;
        }
      }
    }
  }

  private void ProcessingStepOne()
  {
    // Do some work with m_DB
  }

  private void ProcessingStepTwo()
  {
    // Do some work with m_DB
  }
}


多个活动结果集或MARS是SQL 2005/2008和ADO.NET的一项功能,其中一个连接可由多个活动结果集使用(顾名思义)。尝试在连接字符串上关闭此选项,并观察应用程序的行为,我猜这可能是导致您出现问题的原因。有关火星的更多信息,请阅读以下MSDN链接

编辑: 尝试:

AsNoTracking()关闭实体的内部更改跟踪,它还应强制实体框架每次重新加载实体


无论你说了什么,做了什么,你都需要重新考虑,因为你的代码中显然存在设计缺陷。

我讨厌回答我自己的问题,尤其是当我没有很好地解释为什么它能解决问题时

我最终移除了火星,它确实解决了我的问题。我得到的最好解释是:

对于过程请求,无论它们是否返回结果,以及对于返回多个结果的批,始终读取到结果末尾。()


我的应用程序并不总是读取所有返回的结果,因此我的理论是,这会导致缓存数据并重用新的
DbContext

关闭MARS将需要大量重构。我不同意,但我想确定是什么导致了我的问题。我访问过该链接,但找不到任何说明MARS如何影响dbContext缓存的内容。AppDomain中缓存的唯一内容是EF模型(存储模型、概念模型和映射),而不是数据。这取决于你在循环中做了什么。你能再多看一点吗?这是我读到的,但我确实得到了过时/缓存的数据。我发布了一个我认为正在发生的事情的答案。我猜在其他地方,每次调用ProcessingStepOne或ProcessingStepTwo之前,您都会调用Threadloop,以获得新的m_DB上下文来处理?线程细节从您的示例中被省略了,但我想知道您是否在m_DB的每次读/写之前都有一个lock()。这将解释为什么旧的上下文可能会跳转线程。另外,由于EF从定义上讲不是线程安全的,所以没有什么理由在线程之间传递上下文。我也看到过同样的事情发生,尽管不能100%肯定。这是运行在linux机器上的.NET内核(但与SQL server对话)。
var results = context.SomeEntitiy.AsNoTracking() where this = that select s;