使用导航属性加载实体AsNoTracking(),而不指定包含

 恋苦尘雪77 发布于 2023-02-13 18:53

我想知道实体框架是否可以使用以下方案:

我想用AsNoTracking选项加载几个表,因为它们都像用户无法更改的静态表.

这些表也恰好是其他人的导航属性.到目前为止,我依赖于Entity Framework的AutoMapping功能,并且不使用.Include()或LazyLoading功能.

所以代替:

var result = from x in context.TestTable
          .Include("ChildTestTable")
select x;

我这样使用它:

context.ChildTestTable.Load();
context.TestTable.Load();
var result = context.TestTable.Local;

这很顺利,因为应用程序的设计使得数据库中的表非常小,不会有超过600行的表(这在我的应用程序中已经非常高了).

现在我的加载数据的方式,不使用.AsNoTracking().有没有办法使它工作?

所以我可以写:

context.ChildTestTable.AsNoTracking().List();
var result = context.TestTable.AsNoTracking().List();

代替:

var result = from x in context.TestTable.AsNoTracking()
          .Include("ChildTestTable")
select x;

所以基本上,我希望有一个或多个表加载了AutoMapping功能但没有将它们加载到对象状态管理器中,这是否可能?

1 个回答
  • 简单回答是不.对于常规跟踪查询,状态管理器用于身份解析(查找先前加载的给定实体实例并使用它而不是创建新实例)和fixup(将导航属性连接在一起).使用无跟踪查询时,表示未在状态管理器中跟踪实体.这意味着不能发生来自不同查询的实体之间的修复,因为EF无法找到这些实体.

    如果您使用Include和无跟踪查询,那么EF将尝试在查询中的实体之间进行一些修复,这将在很多时候起作用.但是,某些查询可能导致多次引用同一实体,在某些情况下,EF无法知道它是被引用的同一实体,因此您可能会得到重复项.

    我猜你没说的就是为什么你要使用无跟踪.如果您的表没有大量数据,那么您不太可能看到显着的性能提升,尽管许多因素都会影响这一点.(作为一个题外话,使用.Local返回的ObservableCollection也可能影响性能,如果数据永远不会改变,则不应该这样做.)一般来说,如果你有明确的需要,你应该只使用无跟踪,否则它会结束增加复杂性而没有好处.

    2023-02-13 18:57 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有