【问题标题】:Entity Framework - Affect of MultipleActiveResultSets on Caching实体框架 - MultipleActiveResultSets 对缓存的影响
【发布时间】:2013-10-24 23:22:04
【问题描述】:

所以我有一个类似于下面的类。有一个线程使用 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
  }
}

【问题讨论】:

  • AppDomain 中缓存的唯一内容是 EF 模型(存储模型、概念模型和映射),而不是数据。这真的取决于你在循环中做了什么。能再多介绍一点吗?
  • 这就是我读过并想到的,但我肯定得到过时/缓存的数据。我发布了我认为正在发生的事情的答案。
  • 我猜你每次在调用 ProcessingStepOne 或 ProcessingStepTwo 之前调用 Threadloop 是为了获得一个新的 m_DB 上下文来使用?
  • 您的示例中省略了线程详细信息,但我想知道您是否在 m_DB 的每次读/写周围都有一个 lock()。这将解释为什么旧的上下文可能会出现跳转线程。此外,由于 EF 根据定义不是线程安全的,因此几乎没有理由跨线程传递上下文。
  • 我也看到过同样的事情发生,但不能 100% 确定。这是在 linux 机器上运行的 .NET Core(但与 SQL 服务器通信)。

标签: c# entity-framework


【解决方案1】:

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

MSDN - Multiple Active Result Sets

编辑: 试试:

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

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

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

【讨论】:

  • 关闭 MARS 需要大量重构。我不反对它,但我想确定它是什么导致了我的问题。我去过那个链接,但找不到任何说明 MARS 如何影响 dbContext 缓存的内容。
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    • 1970-01-01
    • 2014-03-09
    • 1970-01-01
    相关资源
    最近更新 更多