c# - AsNoTracking() 背后是否有任何隐藏功能?

标签 c# entity-framework

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

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. 我们不存储返回者的值(value),也不对返回者的内容做任何事情
  2. 我们获得了一组新的(显然是可跟踪的)对象来处理

我想删除该行。但是,出于谦虚(即不怕破坏系统),我在删除任何内容之前都很谨慎。我的上下文中是否存在任何可能影响实体第二次检索的隐式更改?

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

最佳答案

如果那行代码与您的项目中的完全一样,则没有任何变化。

context.SomeEntityName.AsNoTracking();

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

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

来源:

关于c# - AsNoTracking() 背后是否有任何隐藏功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33019911/

相关文章:

c# - CQRS 模式上的服务层

entity-framework - 要刷新的对象集合中索引 0 处的元素具有 null EntityKey 属性值或未附加到此 ObjectStateManager

c# - 谷歌邮件类

c# - 如何将函数从 C++ .dll 导入到 C Sharp

c# - 将 UserControl 中的事件绑定(bind)到父窗口路由事件 - C# XAML

c# - 使用百分号在 DataTable 中添加计算列的表达式

c# - .NET 管理层关系

c# - 如何从linq中的子表中选择列

entity-framework - Entity Framework 4.1 "Code First"SetInitializer 在 Database.Delete 之后不再被调用

c# - 新的 .Net MAUI App 项目抛出 'The name ' InitializeComponent' 在当前上下文中不存在' 构建错误