首页 >后端开发 >C++ >更新实体时 EF Core 的 `.AsNoTracking()` 是否会影响数据库写入?

更新实体时 EF Core 的 `.AsNoTracking()` 是否会影响数据库写入?

Susan Sarandon
Susan Sarandon原创
2025-01-09 13:11:40223浏览

Does EF Core's `.AsNoTracking()` Affect Database Writes When Updating Entities?

EF Core 的 .AsNoTracking() 和数据库写入:澄清

Entity Framework Core (EF Core) 提供 .AsNoTracking() 通过禁用更改跟踪来优化查询。 当您只需要读取数据并且不打算在当前上下文中修改它时,这非常有用。 但对后续更新的影响需要慎重考虑。

您的示例突出了一个常见的困惑点:

场景: 使用每个请求上下文,首先使用 .AsNoTracking() 检索用户,然后尝试更新同一用户。

第 1 步: context.Set<user>().AsNoTracking() 检索用户 而不进行 跟踪。

第 2 步: context.Set<user>() 尝试更新未跟踪的用户。

关键区别:

使用 .AsNoTracking() 和不使用

之间的主要区别在于 EF Core 如何管理实体的状态。
  • .AsNoTracking()没有

    EF Core 会跟踪实体。 当您更新并保存时,EF Core 会自动检测更改并相应地更新数据库。 如果您打算修改实体,这是更简单、更直接的方法。
  • .AsNoTracking()对于实体context.Entry(user).State = EntityState.Modified;被跟踪。 EF Core 不知道您所做的更改。 要更新数据库,您必须在调用 context.SaveChanges() 之前使用

    将实体显式附加到上下文。 如果不这样做,可能会导致插入新记录而不是更新现有记录。

.AsNoTracking()简而言之,.AsNoTracking() 为只读操作提供了性能提升。 对于更新操作,要么避免在初始检索中使用

,要么准备在保存更改之前手动管理上下文中实体的状态。 选择取决于您的具体需求以及您是否优先考虑性能或更简单的代码。

以上是更新实体时 EF Core 的 `.AsNoTracking()` 是否会影响数据库写入?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn