【问题标题】:Should I save my objects in memory after using EF to retrieve and create them?使用 EF 检索和创建对象后,是否应该将对象保存在内存中?
【发布时间】:2012-03-19 17:16:45
【问题描述】:

我正在使用 EF 从我的数据库中获取和创建一些对象。我需要在两个不同的迭代中使用这些对象。在第一次迭代中,我从我的数据库中获取它们。在第二个我需要再次使用这些对象。

如果我将对象保存在内存中的 List 中,而不是再次从数据库中检索它们,第二次迭代会更快吗?或者 EF 是否将它们保存在内存中,因为它们最近被使用过?

【问题讨论】:

  • 提供一个例子就好了,不清楚第一次迭代和第二次迭代的区别。将对象保存在列表中是什么意思?
  • 是的,我也看不到这里的问题。答案似乎很明显。但是您可能会要求 EF 为您提供所有不同的可能性?

标签: c# entity-framework


【解决方案1】:

除非您禁用跟踪,否则 EF 将在 DbContext 对象的生命周期内将查询的对象保留在内存中。

如果您不想更新对象,我建议您通过将它们保存到内存而不将它们保存到 DBcontext 来执行此操作,因为这将提高性能。您可以通过在查询中添加 .AsNoTracking() 来做到这一点。

如果您希望将对象保留超过上下文的生命周期,您可以通过将它们缓存在内存中来做到这一点。然后您可以稍后重新附加它们以进行更新

【讨论】:

    【解决方案2】:

    当然,从内存中检索要快得多。顺便说一句,如果您想从内存中获取对象,则不必将其存储在列表中,只需使用Local EF 功能之一。

    【讨论】:

      【解决方案3】:

      您应该像这样 Load 内存中的对象,以便可以使用 Local 属性访问它们:

       context.YourTable.Load();
      

      然后您应该使用Local 属性进行多次迭代。

      foreach(var obj in context.YourTable.Local) {
       ////
      }
      

      您也可以使用ToList(),以便将您的项目加载到内存中

      【讨论】:

        【解决方案4】:

        如果您之后需要它们,为什么不简单地将它们保存在内存中呢?您只存储对轻量级对象的引用。

        【讨论】:

          【解决方案5】:

          尝试使用缓存方法,尤其是对于不需要经常更改的对象

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-10-02
            • 2011-09-26
            • 2013-09-26
            • 2015-12-30
            • 1970-01-01
            • 2014-06-11
            • 1970-01-01
            相关资源
            最近更新 更多