我想知道实体框架是否可以使用以下方案:
我想用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功能但没有将它们加载到对象状态管理器中,这是否可能?
简单回答是不.对于常规跟踪查询,状态管理器用于身份解析(查找先前加载的给定实体实例并使用它而不是创建新实例)和fixup(将导航属性连接在一起).使用无跟踪查询时,表示未在状态管理器中跟踪实体.这意味着不能发生来自不同查询的实体之间的修复,因为EF无法找到这些实体.
如果您使用Include和无跟踪查询,那么EF将尝试在查询中的实体之间进行一些修复,这将在很多时候起作用.但是,某些查询可能导致多次引用同一实体,在某些情况下,EF无法知道它是被引用的同一实体,因此您可能会得到重复项.
我猜你没说的就是为什么你要使用无跟踪.如果您的表没有大量数据,那么您不太可能看到显着的性能提升,尽管许多因素都会影响这一点.(作为一个题外话,使用.Local返回的ObservableCollection也可能影响性能,如果数据永远不会改变,则不应该这样做.)一般来说,如果你有明确的需要,你应该只使用无跟踪,否则它会结束增加复杂性而没有好处.