8

所以我有一个看起来像下面这样的类。有一个线程使用 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
  }
}

4

2 回答 2

4

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

MSDN - 多个活动结果集

编辑:尝试:

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

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

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

于 2013-10-24T23:29:35.930 回答
2

我讨厌回答自己的问题,尤其是当我无法很好地解释为什么它可以解决问题时。

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

对于程序请求,无论它们是否返回结果,以及返回多个结果的批处理,始终读取到结果的末尾。( http://technet.microsoft.com/en-us/library/ms131686.aspx )

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

于 2013-10-28T00:22:27.500 回答