我一直在使用Add()
并遇到一个问题,当Add
一个孩子时,父实体在数据库中被复制了。使用Attach()
解决了这个问题,但我想知道为什么而不是盲目地磕磕绊绊。
答案 0 :(得分:28)
好吧,当你使用Attach
告诉上下文实体已经在数据库中时,SaveChanges
对附加实体没有影响。另一方面,Add
将上下文中的实体状态(如果已经存在)更改为Added
,这意味着它将始终将实体插入数据库中当你拨打SaveChanges
时。
这就是区别。
答案 1 :(得分:3)
如果是ef-core
附加适用于将具有导航属性的新实体添加到数据库的情况。 附加仅将新创建的项目标记为已更改。
假设您要向行业添加新员工。如果数据库中已经存在该行业,则必须具有一个ID。并且您要添加的Employee尚未插入数据库,因此它还没有ID(我在这里谈论行ID )。
所以附件的作用是因为该行业已经有一个ID。附加标记,标记为未更改。而您没有ID的员工将其标记为已添加。
您可以在此处了解有关此主题的更多信息:https://www.learnentityframeworkcore.com/dbcontext/modifying-data#attach