我并不完全清楚在具有密钥的实体上使用 AsNoTracking() 和使用 HasNoKey() 之间有什么区别。据我了解,当使用 AsNoTracking() 时,即使 changetracker 不跟踪结果对象的更改,对象仍保留在 DbContext 的内存中。如果您尝试使用与内存中已存在的键相同的键附加新对象,则会出现错误。(如我错了请纠正我)。
如果您使用 HasNoKey(以前的 DbQuery<>),那么行为是否相同?
我并不完全清楚在具有密钥的实体上使用 AsNoTracking() 和使用 HasNoKey() 之间有什么区别。据我了解,当使用 AsNoTracking() 时,即使 changetracker 不跟踪结果对象的更改,对象仍保留在 DbContext 的内存中。如果您尝试使用与内存中已存在的键相同的键附加新对象,则会出现错误。(如我错了请纠正我)。
如果您使用 HasNoKey(以前的 DbQuery<>),那么行为是否相同?
介绍ModelBuilder.Entity<>().HasNoKey()
是如前所述的重大变化之一EF Core 3.0
:
查询类型现在变成没有主键的实体类型。无键实体类型与以前版本中的查询类型具有相同的功能。
查询类型是一种查询未以结构化方式定义主键的数据的方法。也就是说,查询类型用于映射没有键的实体类型(更可能来自视图,但可能来自表),而当键可用时使用常规实体类型(更可能来自表,但可能来自看法)。
你之前这么说:
如果您尝试使用与内存中已存在的键相同的键附加新对象,则会出现错误。(如我错了请纠正我)。如果您使用 HasNoKey(以前的 DbQuery<>),那么行为是否相同?
- EF Core 事务中的跟踪基于实体主键。正如上面的文档清楚地说明EntityType
with .HasNoKey()
is QueryType
which 没有定义任何键。EntityType
因此在with的情况下跟踪是完全无效的HasNoKey()
。
有关更多详细信息:查询类型与实体类型合并