首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除Clear()和EntityCollection ()方法

删除Clear()和EntityCollection ()方法
EN

Stack Overflow用户
提问于 2010-10-07 01:51:23
回答 5查看 30.7K关注 0票数 14

删除EF实体的所有集合项目的正确方法是什么?在下面的代码中,DocumentItems是文档的相关文档项的集合。此代码在Clear()上继续执行,但在SaveChanges()上失败,因为相关项通过FK连接到它们的文档,而FK是强制的。因此,我猜在Clear()之后,它们在没有外键的情况下仍然以某种方式漂浮在空中。

我是通过在集合上调用Remove()来解决这个问题呢,还是有其他的方法呢?

代码语言:javascript
复制
// remove existing document items to prepare for refreshing them
existing.DocumentItems.Clear();
// adds new Document Items
PrepareInvoice(existing, collection);
_repository.SaveChanges();
EN

回答 5

Stack Overflow用户

发布于 2010-10-07 01:59:45

清除仅移除引用,但不删除实体。

在你的情况下

代码语言:javascript
复制
existing.DocumentItems.Clear();  

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

你需要遍历分离任何引用,然后删除你想要移除的实体(除非它是nullable,在你的情况下,它不是)

或者,我见过使用clear和AssociationChangedHandler自动删除旧对象的实现。基本上,如果更改是“删除/移除”,它会在孤立对象上调用DeleteObject()

票数 13
EN

Stack Overflow用户

发布于 2012-07-19 01:34:28

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

VB

代码语言:javascript
复制
TEntityCollection.ToList().ForEach(Sub(o) ctx.DeleteObject(o))

C#

代码语言:javascript
复制
TEntityCollection.ToList().ForEach(x => ctx.DeleteObject(x))

然后你需要调用

代码语言:javascript
复制
ctx.SaveChanges()
票数 13
EN

Stack Overflow用户

发布于 2014-07-09 12:14:22

技巧:在设置父项和子项之间的关系时,您必须在子项上创建一个“组合”键。这样,当您告诉父级删除1个或所有子级时,相关记录实际上将从数据库中删除。

使用Fluent API配置组合密钥:

代码语言:javascript
复制
modelBuilder.Entity<Child>.HasKey(t => new { t.ParentId, t.ChildId });

然后,删除相关的子项:

代码语言:javascript
复制
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();

完成了!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3875439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档