33

我一直在使用Add()并遇到一个问题,即当一个孩子在数据库中复制一个父实体Add。使用Attach()解决了这个问题,但我想知道为什么而不是盲目地跌跌撞撞。

4

2 回答 2

36

好吧,当您使用Attach时告诉上下文实体已经在数据库中,SaveChanges对附加实体没有影响。Add另一方面,将上下文中实体的状态(如果它已经存在)更改为,这意味着当您调用 时Added,它将始终SaveChanges将实体插入数据库中。

这就是区别。

于 2013-04-11T14:19:57.823 回答
6

在 ef-core 的情况下

附加适用于向具有导航属性的数据库添加新实体的情况。附加仅将新创建的项目标记为已更改

假设您要向行业添加新员工。如果数据库中已经存在该行业,则它必须有一个 ID。并且您要添加的 Employee 尚未插入到数据库中,因此它还没有 ID(我在这里谈论的是行 ID)。

所以 attach 所做的是因为 Industry 已经有一个 ID。附加标记为Unchanged。并且您还没有 ID 的 Employee 将其标记为已添加

您可以在此处阅读有关此主题的更多信息:https ://www.learnentityframeworkcore.com/dbcontext/modifying-data#attach

于 2020-04-30T20:48:46.627 回答