何时使用DbSet <T> .Add()vs DbSet <T> .Attach()

dav*_*v_i 29 c# asp.net-mvc entity-framework

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

And*_*eza 31

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

这就是区别.

  • 因为当你 `Attach()` 一个已经在 **context** 中的实体时,就像存储在 `model` 变量中的实体一样,它会将实体的状态设置为 `Unchanged`,因此如果你为此使用 `Attach()`,当您调用 `SaveChanges()` 时,您的实体将不会更新。 (2认同)

Man*_*ahi 5

如果是 ef-core

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

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

所以 attach 的作用是因为行业已经有了一个 ID。附加标记为Unchanged。而您尚未附加 ID 的 Employee 将其标记为已添加

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

  • 应该清楚的是,EF6 和 EF-core 在这里是不同的。EF6 不会将附加实体标记为“已添加”。 (2认同)