When to use DbSet.Add() vs DbSet.Attach()
我一直在使用Add()并遇到一个问题,其中在Add生育孩子时,在数据库中复制了一个父实体。 使用Attach()解决了这个问题,但是我想知道为什么而不是盲目地绊脚石。
-
我认为这个stackoverflow.com/questions/3920111/有望回答您的问题
-
谢谢。 这也有帮助:stackoverflow.com/a/15310068/1185053
好吧,当您使用Attach时,您会告诉上下文该实体已存在于数据库中,而SaveChanges不会对连接的实体产生影响。另一方面,Add会将上下文中实体的状态(如果已经存在)更改为Added,这意味着当您调用SaveChanges时,它将始终将实体插入数据库中。
就是这样。
-
感谢您的回复。 为什么然后在Edit中自动生成的Controller中使用db.Entry(model).State = EntityState.Modified; db.SaveChanges();而不使用Attach()?
-
因为当Attach()实体已经存在于上下文中时(如存储在model变量中的实体一样),它会将实体状态设置为Unchanged,因此如果为此使用Attach() 当您调用SaveChanges()时,您的实体将不会更新。
in case of ef-core
当您将具有导航属性的新实体添加到数据库时,附加功能非常有用。仅附加将新创建的项目标记为已更改。
假设您要向行业添加新员工。如果数据库中已经存在该行业,则必须具有一个ID。并且您要添加的Employee尚未插入数据库,因此它还没有ID(我在这里谈论的是行ID)。
所以附加功能是因为该行业已经有一个ID。附加标记为"不变"。而您没有ID的员工将其标记为"已添加"。
您可以在这里阅读有关此主题的更多信息:https://www.learnentityframeworkcore.com/dbcontext/modifying-data#attach
-
应该清楚的是,此处的EF6和EF-core不同。 EF6不会将附加的实体标记为Added。