实体框架 - MultipleActiveResultSets对缓存的影响

ray*_*ley 6 c# entity-framework

所以我有一个类似下面的类.有一个线程使用Entity Framework Code First 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
  }
}

Run Code Online (Sandbox Code Playgroud)

Ahs*_*san 5

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

MSDN - 多个活动结果集

编辑:尝试:

var results = context.SomeEntitiy.AsNoTracking() where this = that select s;
Run Code Online (Sandbox Code Playgroud)

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

无论说什么和做什么,您都需要进行一定程度的重构,因为您的代码中显然存在设计缺陷。