使用.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 的一对一关系

在 ASP.NET Core 中使用 Entity Framework 6

ADO.NET Entity Framework