我正在处理一个大型项目(有许多不同的厨师制作汤,多年来过去了)并且刚刚发现了以下代码。
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 来说,这是一种“即发即弃”。
注意到:
- 我们不存储返回者的值(value),也不对返回者的内容做任何事情
- 我们获得了一组新的(显然是可跟踪的)对象来处理
我想删除该行。但是,出于谦虚(即不怕破坏系统),我在删除任何内容之前都很谨慎。我的上下文中是否存在任何可能影响实体第二次检索的隐式更改?
我没有找到任何关于它的信息——无论是支持还是反对该理论。此外,我还没有找到 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/