ObjectTrackingEnabled和linq-to-sql

时间:2012-10-22 22:44:01

标签: c# linq-to-sql

我在阅读here时,在查询数据以进行读取操作时,将ObjectTrackingEnabled设置为false可以提高性能。我的查询看起来像这样:

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

       return TheQuery;
   }
}

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

2)另外,如果我在查询中将ObjectTrackingEnabled设置为true,我是否需要在返回之前将其设置为false,或者我只是设置{{1对于数据上下文的特定实例以及随后的时间,我将实例化一个新的数据上下文,ObjectTrackingEnabled的值将恢复为其默认状态ObjectTrackingEnabled

注意:我只计划添加false来阅读操作。

感谢。

3 个答案:

答案 0 :(得分:8)

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

自然地,让数据上下文执行的操作会更少,这样可以加快速度,但代价是通过跟踪更改为加载带来负担。为什么变更跟踪很酷?因为你可以:

  1. 从某些上下文中加载一些实体
  2. 修改它们
  3. 添加新内容,删除其他内容
  4. 调用SaveChanges并让数据上下文找出对修改后的实体进行UPDATE查询,为已删除的实体执行DELETE等等。
  5. 禁用更改跟踪后,您必须明确告知上下文更改内容,新值是什么等等。

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

    1. 为您创建的每个数据上下文手动设置
    2. 在上下文的构造函数中将其设置为上下文的默认值,如下所示:this.Configuration.AutoDetectChangesEnabled = true;有关详细信息,请参阅this blog post
    3. 希望这有帮助!

答案 1 :(得分:2)

参考:

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

查询性能增强来自NOT跟踪。 因此,您希望在为此目的创建新的datacontext之后立即在READ个查询中禁用此功能。

ObjectTrackingEnabled = FALSE 

答案 2 :(得分:0)

您的标签和主题标题是' Linq2SQL'但你的问题是关于Entity Framwork。

对于传统的' Linq2SQL你需要这个:

 linq2SqlDBContext.ObjectTrackingEnabled = false;