EntityCollection Clear()和Remove()方法

mar*_*are 13 entity-framework entity-framework-4

删除EF实体的所有集合项的正确方法是什么?在下面的代码中,DocumentItems是文档的相关文档项的集合.此代码在Clear()上进行,但在SaveChanges()上失败,因为相关项通过FK连接到其文档,FK是必需的.所以我猜他们在Clear()之后没有外键的情况下仍然悬浮在空中.

我是否通过在每个项目上调用Remove()的集合上的foreach循环来解决这个问题,还是有另一种方法?

// remove existing document items to prepare for refreshing them
existing.DocumentItems.Clear();
// adds new Document Items
PrepareInvoice(existing, collection);
_repository.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

Bri*_*izo 13

这是删除集合中项目的一种方法.

VB

TEntityCollection.ToList().ForEach(Sub(o) ctx.DeleteObject(o))
Run Code Online (Sandbox Code Playgroud)

C#

TEntityCollection.ToList().ForEach(x => ctx.DeleteObject(x))
Run Code Online (Sandbox Code Playgroud)

然后你需要打电话

ctx.SaveChanges()
Run Code Online (Sandbox Code Playgroud)


Nix*_*Nix 11

Clear只删除引用,但不删除entiy.

在你的情况下

existing.DocumentItems.Clear();  
Run Code Online (Sandbox Code Playgroud)

EntitySet中的所有DocumentItem都将被清除,但您必须删除/删除实际的DocumentItem或提交失败,就像您尝试在数据库中删除它一样.

你需要循环遍历任何引用,然后删除你想要删除的实体(除非它可以为空,在你的情况下它不是)


或者,我已经看到使用clear的实现,以及一个AssociationChangedHandler来自动删除旧对象.基本上,如果更改是"删除/删除",则它会调用孤立对象上的DeleteObject().

  • 首先,我认为具有讽刺意味的是,我们正在讨论"清除"如何不明确.我的理解是他们是不同的.清楚只是说删除指针(在内存中)这些对象.`删除'说从我的列表中删除并标记删除...如果我说了什么无效,请纠正我. (7认同)