【问题标题】:Is there any hidden functionality behind AsNoTracking()?AsNoTracking() 背后是否有任何隐藏功能?
【发布时间】:2015-10-08 15:22:20
【问题描述】:

我正在处理一个大型项目(多年来,有许多不同的厨师在做汤)并且刚刚发现了以下代码。

private IEnumerable<string> SomeSome()
{
  using(DataModel context = DataModel())
  {
    context.SomeEntityName.AsNoTracking();
    ...
    return context.SomeEntityName
      .Where(entity => true)
      .Select(entity => String.Empty);
  }
}

现在,我对 AsNoTracking 方法和 it's clearly said 进行了三次检查,以返回一个与 EF 的跟踪设施无关的可查询对象。可以说是 ORM 的一种“一劳永逸”。

注意:

  1. 我们不存储价值,也不对返回者的内容做任何事情
  2. 我们获得了一组新的(显然是可跟踪的)对象来做事

我想删除该行。但是,出于谦虚(即害怕不怕损坏系统),在删除任何内容之前我会很谨慎。在我的上下文中是否有任何隐含的变化可能会影响实体的第二次检索?

我没有找到任何关于它的信息 - 既不支持也不反对该理论。此外,我还没有找到 EF 5.0 以外的任何其他版本的文档(如上面的链接所示),但我们使用的是 EF 6.1.3,而且我知道所讨论的方法也存在于 EF 4 中。

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    如果该行代码与您的项目中的代码完全相同,则没有任何变化。

    context.SomeEntityName.AsNoTracking();
    

    this ^^^ 返回未保存在任何地方的可查询对象。如果您删除该行,则该行的查询将没有区别。

    更新 我浏览了 EF 的源代码。据我所知,AsNoTracking() 不会改变您正在使用的DbContext 对象的状态。因此,如果在一个查询上调用此方法,它应该不会影响其他查询的执行。如果是这样 - 这是 EF 中的一个错误,应该报告。在我项目的多个地方,我有相同的 dbContext 查询,有跟踪和没有跟踪。一切都按预期进行。

    来源:

    【讨论】:

    • @paddy Okej,所以我们有两个高级用户提出,在我看来,两个对角相反的陈述。评论?
    • 是的,我也在研究另一个答案——对我来说是新事物。一旦我有更多答案,我会更新我的答案。
    • 不要。您的回答是您(我认为)丰富经验的足迹。即使它不完全正确,它也具有很高的价值。它可能是黑客只与旧版本的 EF 相关。此外,它还可用于隐藏代码中其他地方的性能问题。
    • 哦,太晚了 - 已经完成更新,并带有指向实际源代码的链接。有那么一刻我怀疑自己的理智 -)
    • 为了彻底性+1。但是你为什么要质疑你的理智呢?
    【解决方案2】:

    如果你序列化这个对象,如果你定义了多对多关系,你可能会发现你遇到了问题。 AsNoTracking() 电话可能已经到位以解决此问题,如下所示:

    Serialization of Entity Framework objects with One to Many Relationship

    平心而论,这有点像 hack,可能会导致(正如您刚刚注意到的)人们想知道为什么在维护时调用它。如果这是被序列化的,最好有一个单独的可序列化 DTO,而不是传递上下文对象本身。


    我还要注意,有一些关于关闭跟踪以提高性能的讨论。根据您所击中的内容,您可以(显然)在禁用跟踪时获得显着的性能改进。

    【讨论】:

    • 我认为您误解了这个问题。如果AsNoTracking 对未应用AsNoTracking 的其他查询有影响,OP 会担心。你能再看看这个吗,因为我开始担心我是否以不正确的方式使用了很长时间。
    • @trailmax - OP 询问在删除此问题时是否可能出现任何问题(通常)。这是一个可能的问题(并且是我遇到并更改代码以避免使用无跟踪的问题)。听起来你可能有不同的问题?虽然这不会影响第二个查询结果,但可能会对下游产生影响,因为返回的结果状态会略有不同(即未跟踪)。
    猜你喜欢
    • 1970-01-01
    • 2020-05-29
    • 2021-08-20
    • 1970-01-01
    • 2012-09-23
    • 2021-01-26
    • 1970-01-01
    • 2020-06-01
    相关资源
    最近更新 更多