使用.Net Entity Framework 问题删除具有子关系的实体
Posted
技术标签:
【中文标题】使用.Net Entity Framework 问题删除具有子关系的实体【英文标题】:Deleting entity with child relationships using .Net Entity Framework problem 【发布时间】:2010-04-10 15:20:09 【问题描述】:我的上帝,EF 太令人沮丧了。我似乎无法理解我需要做什么,所以我可以删除一个对象。我似乎能够删除对象,但不能删除相关的子对象。当您想删除给定对象的所有相关子对象时,谁能告诉我经验法则是什么?
我试过像这样加载所有相关的对象:
Entry entry = ModelContext.GetObjectByKey(new EntityKey("ModelContainer.EntrySet", "Id", id)) as Entry;
entry.ChildEnteries.Load();
if (entry != null)
ModelContext.DeleteObject(entry);
ModelContext.SaveChanges();
我收到与关系相关的错误:A relationship is being added or deleted from an AssociationSet 'EntryEntry'. With cardinality constraints, a corresponding 'Entry1' must also be added or deleted.
为什么我不能只使用modelcontext.GetObjectByKey
加载对象并将其连同其子对象一起删除?
我的另一个问题是我可以像这样使用实体命令删除对象吗?
DELETE e from objectset as e where e.id = 12
我尝试了几种变体,所有变体都抛出异常。
【问题讨论】:
“我的上帝,EF 太令人沮丧了”+1 :) 【参考方案1】:如果您不使用级联删除,则必须单独删除引用的对象。
那么我想你想要这样的东西:
ObjectSet os = ModelContext.ObjectSet.First(x => x.id == 12);
ModelContext.DeleteObject(os);
ModelContext.SaveChanges();
您也可以在实体框架中进行级联删除,但请确保在 SQL 中进行设置,然后确保从 EDMX 文件中的数据源进行更新。特别是make sure CSDL part has the following:
<Association Name="FK_ItemChildren_Item">
<End Type="Model.Item" Role="Item" Multiplicity="1">
<OnDelete Action="Cascade"></OnDelete>
</End>
<End Type="Model.ItemChildren" Role="ItemChildren"
Multiplicity="*">
</End>
</Association>
【讨论】:
之前尝试过您的解决方案。它只删除对象而不是相关的子对象。 问题是我手动定义了 edmx 文件并将我的实体的字段映射到数据库中的表字段。我在 mysql 中的所有表都是 MyISAM,我没有为它们定义外键。即使在 db 中没有定义实际的外键,手动添加级联删除到 edmx 文件是否有效? @Am:我不确定,你可以试试。请参阅链接,您需要将其添加到 2 个部分。 @Brian R. Bondy:我会在链接中给出建议,让你知道会发生什么 Brian R. Bondy:顺便说一句,在这些不同的 ORM 技术(即 EF、NHibernate 等)之间,您认为哪一种最容易使用?我真的厌倦了 .Net 中的 ORM,它确实不是那么成熟或直接。以上是关于使用.Net Entity Framework 问题删除具有子关系的实体的主要内容,如果未能解决你的问题,请参考以下文章
使用Entity Framework时如何在Winform场景下实现DataGridView的分页?
ADO.NET Entity Framework 和 NHibernate - 何时使用其中之一
如何使用扩展方法加入 .NET Entity Framework 中的多个列?
Entity Framework 和 .NET 的一对一关系