删除EF实体的所有集合项目的正确方法是什么?在下面的代码中,DocumentItems是文档的相关文档项的集合。此代码在Clear()上继续执行,但在SaveChanges()上失败,因为相关项通过FK连接到它们的文档,而FK是强制的。因此,我猜在Clear()之后,它们在没有外键的情况下仍然以某种方式漂浮在空中。
我是通过在集合上调用Remove()来解决这个问题呢,还是有其他的方法呢?
// remove existing document items to prepare for refreshing them
existing.DocumentItems.Clear();
// adds new Document Items
PrepareInvoice(existing, collection);
_repository.SaveChanges();发布于 2010-10-07 01:59:45
清除仅移除引用,但不删除实体。
在你的情况下
existing.DocumentItems.Clear(); EntitySet中的所有DocumentItems都将被清除,但您必须移除/删除实际的DocumentItem或提交失败,就像您尝试在数据库中删除它一样。
你需要遍历分离任何引用,然后删除你想要移除的实体(除非它是nullable,在你的情况下,它不是)
或者,我见过使用clear和AssociationChangedHandler自动删除旧对象的实现。基本上,如果更改是“删除/移除”,它会在孤立对象上调用DeleteObject()。
发布于 2012-07-19 01:34:28
这是删除集合中项的一种方法。
VB
TEntityCollection.ToList().ForEach(Sub(o) ctx.DeleteObject(o))C#
TEntityCollection.ToList().ForEach(x => ctx.DeleteObject(x))然后你需要调用
ctx.SaveChanges()发布于 2014-07-09 12:14:22
技巧:在设置父项和子项之间的关系时,您必须在子项上创建一个“组合”键。这样,当您告诉父级删除1个或所有子级时,相关记录实际上将从数据库中删除。
使用Fluent API配置组合密钥:
modelBuilder.Entity<Child>.HasKey(t => new { t.ParentId, t.ChildId });然后,删除相关的子项:
var parent = _context.Parents.SingleOrDefault(p => p.ParentId == parentId);
var childToRemove = parent.Children.First(); // Change the logic
parent.Children.Remove(childToRemove);
// or, you can delete all children
// parent.Children.Clear();
_context.SaveChanges();完成了!
https://stackoverflow.com/questions/3875439
复制相似问题