gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:07:23 26 4
gpt4 key购买 nike

我想知道 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 行的表(这在我的应用程序中已经相当高的值(value))。

现在我加载数据的方式不适用于 .AsNoTracking()。有什么办法让它发挥作用吗?

所以我可以写:

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

代替:

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

所以基本上,我想加载 1 个或多个表并启用 AutoMapping 功能,但不将它们加载到对象状态管理器中,这可能吗?

最佳答案

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

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

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

关于c# - 使用导航属性加载实体 AsNoTracking(),而不指定包含,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20289721/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com