+-

我正在处理一个大型项目(多年来,许多不同的厨师在做汤),并发现了以下代码.
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来说是一种“一劳永逸”的方式.
注意:
>我们不存储该值,也不对返回者的内容做任何事情
>我们获得了一组新的(并且显然是可跟踪的)对象来进行处理
我要删除该行.但是,由于谦虚(即不怕便便地破坏系统),在删除任何内容之前我会保持谨慎.我的上下文中是否存在任何隐式更改,这些更改可能会影响实体的第二次检索?
我还没有找到任何有关它的信息,无论是赞成还是反对该理论.另外,我没有找到除5.0以外的任何其他版本EF的文档(如上面的链接所示),但是我们使用的是EF 6.1.3,并且我知道问题的方法也出现在EF 4中.
最佳答案
如果该行代码与您的项目中的代码完全相同,则没有任何变化.
context.SomeEntityName.AsNoTracking();
此^^^返回未保存在任何地方的可查询对象.如果删除该行,则该行下的查询没有任何区别.
更新
我浏览了EF的源代码.据我所知,AsNoTracking()不会更改您正在使用的DbContext对象的状态.因此,如果在一个查询上调用了此方法,则它丝毫不会影响其他查询的执行.如果是这样-这是EF中的错误,应报告.在我的项目的多个地方,我有相同的dbContext查询,而没有跟踪.一切都按预期进行.
资料来源:
> DbQuery.AsNoTracking()
> DbHelpers.CreateNoTrackingQuery
> TranslatorVisitor.Visit() Line 341+
点击查看更多相关文章
转载注明原文:的AsNoTracking()背后有隐藏的功能吗? - 乐贴网