EF Core 中的 .AsNoTracking():详解及更新的影响
EF Core 中的 .AsNoTracking()
方法常常令人困惑,尤其对于初学者而言。为了阐明其作用,让我们分析一个具体的场景及其对数据库交互的影响。
假设网站的实体存储在一个每次请求的上下文中。许多实体保持不变,不需要跟踪。但是,以下场景提出了一个难题:
<code class="language-csharp">context.Set<User>().AsNoTracking() // 步骤 1) 获取用户 context.Set<User>() // 步骤 2) 更新用户</code>
或者,我们可以从步骤 1 中移除 .AsNoTracking()
:
<code class="language-csharp">context.Set<User>(); // 步骤 1) 获取用户 context.Set<User>() // 步骤 2) 更新用户</code>
在这两种情况下,上下文都用于检索(步骤 1)和更新(步骤 2),但它们发生在不同的时间。问题是:这有区别吗?
答案在于跟踪的性质。在第一种场景中,步骤 1 使用 .AsNoTracking()
,检索到的用户不会被上下文跟踪。这意味着当更新用户(步骤 2)时,您必须手动附加用户并将它的状态显式设置为“已修改”。这会通知 EF Core 更新现有用户,而不是创建新记录。
相反,在第二种情况下,如果没有 .AsNoTracking()
,如果您在同一个上下文实例中加载和保存用户,则不需要执行这些手动步骤。跟踪机制会自动处理此问题,提供更新的用户而无需额外的配置。
总而言之,这两种方法的区别在于 .AsNoTracking()
会禁用对检索到的实体的跟踪,需要在更新期间手动管理对象状态和附加。在没有 .AsNoTracking()
的情况下,使用相同的上下文进行检索和更新可以简化此过程,因为跟踪机制会透明地处理这些方面。
以上是EF Core AsNoTracking():什么时候更新很重要?的详细内容。更多信息请关注PHP中文网其他相关文章!