實體框架 - 清除子集合

entity-framework

我遇到了一個有趣的Entity Framework問題,基於我必須使用的代碼解決它我懷疑我的解決方案不太理想。我在表A和表B之間具有1對多的關係,其中表B中的實體具有對TableA的引用。我有一個場景,我想同時刪除TableA中連續的所有子項,我認為這可以通過簡單地清除集合來實現:

Entity.Children.Clear()

不幸的是,當我嘗試保存更改時,這會產生外鍵違規。

正在從AssociationSet'FK_EntityB_EntityA'添加或刪除關係。對於基數約束,還必須添加或刪除相應的“EntityB”。

我想出的解決方案是通過實體上下文的DeleteObject()手動刪除對象,但我只知道我使用的這個邏輯必定是錯誤的。

while (collection.Any())
    Entities.DeleteObject(collection.First());

首先,我必須使用Where()循環的事實似乎遠遠不夠理想,但我認為這純粹是我的語義評估。在任何情況下,我是如何做到這一點的,或者是否有更好的方法來清除實體的子實體集合,以便實體框架正確地調用所有被刪除對像上的數據存儲刪除?

一般承認的答案

Clear()刪除對實體的引用 ,而不是實體本身。

如果您希望它始終是相同的操作,您可以處理AssociationChanged

Entity.Children.AssociationChanged += 
    new CollectionChangeEventHandler(EntityChildrenChanged);
Entity.Children.Clear();            

    private void EntityChildrenChanged(object sender,
        CollectionChangeEventArgs e)
    {
        // Check for a related reference being removed. 
        if (e.Action == CollectionChangeAction.Remove)
        {
            Context.DeleteObject(e.Element);
        }
    }

您可以使用分部類將其構建到您的實體中。


熱門答案

您可以創建父實體和子實體之間的標識關係,當您從父集合中刪除子實體時,EF將刪除子實體。

    public class Parent
    {
      public int ParentId {get;set;}
      public ICollection<Child> Children {get;set;}
    }

    public class Child
    {          
      public int ChildId {get;set;}
      public int ParentId {get;set;}
    }

映射配置:

    modelBuilder.Entity<Child>().HasKey(x => new { x.ChildId, x.ParentId });
    modelBuilder.Entity<Parent>().HasMany(x => x.Children).WithRequired().HasForeignKey(x => x.ParentId);


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因