7

在这里读到,在查询数据以进行读取操作时,设置ObjectTrackingEnabledfalse会在一定程度上提高性能。我的查询如下所示:

public return type TheQueryName (some parameters)
{
   using (TheDC MyDC = new TheDC())
   {
       var TheQuery = (...).ToList();

       return TheQuery;
   }
}

1)如果我想添加性能增强,我只是在该行ObjectTrackingEnabled = true;之前添加该行var TheQuery = (...).ToList();

2)另外,如果我在查询中设置ObjectTrackingEnabledtrue,是否需要在返回之前将其设置为 false 还是我只是ObjectTrackingEnabled为数据上下文的特定实例设置,接下来我将实例化一个新的数据上下文的值ObjectTrackingEnabled 将恢复到其默认状态false

注意:我只打算添加ObjectTrackingEnabled = false;到读取操作。

谢谢。

4

3 回答 3

11

ObjectTrackingEnabled 控制您的数据上下文(TheDC在您的情况下)是否会在加载实体后跟踪实体的更改。你是否想要这个取决于你的具体情况。

自然地,让数据上下文做更少的事情会使其运行得更快,但代价是让您承担跟踪更改的负担。为什么变更跟踪很酷?因为你能:

  1. 从某些上下文加载一些实体
  2. 修改它们
  3. 添加新的,删除其他的
  4. 调用SaveChanges并让数据上下文弄清楚对修改的实体进行 UPDATE 查询,对已删除的实体进行 DELETE 查询等

禁用更改跟踪后,您必须明确地告诉上下文发生了什么变化、新值是什么等。

假设您仍然不想要对象跟踪,则在每个特定数据上下文实例上设置该属性。这意味着您必须:

  1. 为您创建的每个数据上下文手动设置它
  2. 在上下文的构造函数中将其设置为上下文的默认值,如下所示:有关详细信息,this.Configuration.AutoDetectChangesEnabled = true;请参阅此博客文章

希望这可以帮助!

于 2012-10-22T23:02:18.727 回答
3

您的标签和主题行说“Linq2SQL”,但您的问题是关于实体框架的。

对于“传统”Linq2SQL,您需要这个:

 linq2SqlDBContext.ObjectTrackingEnabled = false;
于 2016-09-25T21:53:04.990 回答
3

在参照:

1)如果我想添加性能增强,我只是添加行ObjectTrackingEnabled = true; just before the line var TheQuery = (...).ToList();

查询性能增强来自于不跟踪。因此,您希望在READ为此目的创建新数据上下文之后立即禁用查询的此功能。

ObjectTrackingEnabled = FALSE 
于 2017-01-24T22:29:29.420 回答