实体框架

可以使用以下两种方法使用 EF 从数据库中删除项。

第一个在 EntityCollection上,第二个在 ObjectContext上。

何时使用?

一个比另一个更受欢迎吗?

Remove()返回 boolDeleteObject()返回 void

141364 次浏览

一般来说,两种方法都可以使用“ 从数据库中删除一项”是不正确的。确切地说,是这样的:

  • ObjectContext.DeleteObject(entity)在上下文中标记 实体为 Deleted。(之后是 EntityStateDeleted)如果之后调用 SaveChanges,EF 将向数据库发送一条 SQLDELETE语句。如果没有违反数据库中的引用约束,则将删除该实体,否则将引发异常。

  • 标记为 父母与 ABC1之间的关系称为 Deleted。如果从数据库中删除了 childEntity本身,那么当您调用 SaveChanges时会发生什么取决于两者之间的关系:

    • 如果关系是 可以选择,也就是说,数据库中从子级到父级的外键允许 NULL值,这个外键将被设置为 null,如果你调用 SaveChanges,这个 childEntityNULL值将被写入数据库(也就是说,两者之间的关系被删除)。这种情况发生在 SQLUPDATE语句中。没有发生 DELETE语句。

    • 如果这个关系是 需要(FK 不允许 NULL值) ,而这个关系是 无法辨认(这意味着外键不是子键(复合)主键的一部分) ,那么你要么将子键添加到另一个父键,要么显式删除子键(使用 DeleteObject)。如果你不这样做任何一个引用约束是违反和 EF 将抛出一个异常时,你调用 SaveChanges-臭名昭著的 关系无法更改,因为一个或多个外键属性是非空的异常或类似。

    • 如果关系是 识别(它必须是 需要,因为主键的任何部分都不能是 NULL) EF 将把 childEntity也标记为 Deleted。如果调用 SaveChanges,则 SQLDELETE语句将被发送到数据库。如果没有违反数据库中的其他引用约束,则将删除该实体,否则将引发异常。

我实际上有点困惑的 MSDN 页上的备注部分你已经链接,因为它说: “ 如果关系具有参照完整性约束,则对依赖对象调用 delete 方法将标记关系和依赖对象以便删除。”。这对我来说似乎不精确,甚至是错误的,因为上述三种情况都有一个“ 参照完整性限制”,但只有在最后一种情况下,孩子实际上被删除了。(除非他们的意思是“ 依赖对象依赖对象”一个对象,参与一个确定的关系,这将是一个不寻常的术语。)

如果你真的想要使用 Delete,你必须使你的外键为空,但是你最终会得到孤立的记录(这是你不应该首先这样做的主要原因之一)。那就用 Remove()

ObjectContext.DeleteObject (tity) 在上下文中将该实体标记为 Delete。(它的 EntityState 在此之后被删除。)如果事后调用 SaveChanges,EF 将向数据库发送一条 SQLDELETE 语句。如果没有违反数据库中的引用约束,则将删除该实体,否则将引发异常。

EntityCollection.Delete (children Entity) 将“父”和“子实体”之间的关系标记为“已删除”。如果从数据库中删除了 children Entity 本身,那么当您调用 SaveChanges 时会发生什么取决于两者之间的关系:

值得注意的是,设置 .State = EntityState.Deleted 不会触发自动检测到的变化。 (< a href = “ https://archive. is/mgCSN”rel = “ noReferrer”> archive )