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

时间:2013-11-29 16:13:06

标签: c# entity-framework

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

我想用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 个答案:

答案 0 :(得分:11)

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

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

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