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

时间:2013-10-24 23:22:05

标签: 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
  }
}

2 个答案:

答案 0 :(得分:3)

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

MSDN - Multiple Active Result Sets

编辑: 尝试:

var results = context.SomeEntitiy.AsNoTracking() where this = that select s;

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

无论做了什么和做了什么,你都需要进行一些重新分解,因为你的代码中显然存在设计缺陷。

答案 1 :(得分:2)

我讨厌回答我自己的问题,特别是当我没有很好地解释为什么它能解决这个问题时。

我最终删除了MARS,它确实解决了我的问题。我的最佳解释是:

  

无论是否返回结果,始终读取结果请求的结尾,以及返回多个结果的批次。 (http://technet.microsoft.com/en-us/library/ms131686.aspx

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