代码之家  ›  专栏  ›  技术社区  ›  Roman

使用.NET实体框架删除具有子关系的实体的问题

  •  2
  • Roman  · 技术社区  · 14 年前

    天哪,英孚真让人沮丧。我似乎无法理解我需要做什么才能删除一个对象。我似乎可以删除对象,但不能删除相关的子对象。当你想删除一个给定对象的所有相关子对象时,有人能告诉我什么是经验法则吗?

    我试过加载所有相关对象,如:

    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
    

    我尝试过一些变体,但都抛出了异常。

    1 回复  |  直到 14 年前
        1
  •  3
  •   Brian R. Bondy    14 年前

    如果不使用层叠删除,则必须独立删除引用的对象。

    我想你想要这样的东西:

    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>