簡體   English   中英

實體框架:從父級刪除子級對象列表

[英]Entity Framework: delete list of child objects from parent

我基本上有一個非常簡單的一對多親子關系設置。 例如:

public class Parent
{
   public Guid Id { get; set; }
   public virtual ICollection<Child> Children { get; set; }
}

public class Child
{
   public Guid Id { get; set; }
   public Guid ParentId { get; set; }
   public virtual Parent Parent { get; set; }
}

使用FluentValidation將其配置為:

public ChildConfiguration()
{
   ToTable("children");
   HasKey(c => c.Id);

   Property(c => c.Id).HasColumnName("id");

   HasRequired(c => c.Parent).WithMany(p => p.Children);
}

我現在有一個API,該API提供了父級的子級列表,但是我不想每次都將子級列表添加到現有列表中。 相反,我想刪除所有現有的子代以將其替換為新的子代。

我嘗試通過獲取父級,清除當前的子級列表並添加新的子級來做到這一點。

var parent = await _repository.GetById(parentId);
parent.Children.Clear();
foreach (var child in children)
{
    parent.Children.Add(child);
}

這不起作用,因為它引發異常:

操作失敗:由於一個或多個外鍵屬性不可為空,因此無法更改該關系。 對關系進行更改時,相關的外鍵屬性將設置為空值。 如果外鍵不支持空值,則必須定義新的關系,必須為外鍵屬性分配另一個非空值,或者必須刪除不相關的對象。

據我了解,這是因為它試圖刪除兩個實體之間的鏈接,而不是實際上從數據庫中刪除它。

一種解決方案是直接訪問DbContext中的Children並執行RemoveRange,如下所示:

DbContext.Children.RemoveRange(children);

但是我不想直接在上下文中公開我的Children實體。 相反,我一直想通過父母。 所以我可以在存儲庫中創建一個方法,例如:

var parent = DbContext.Parents.Find(parentId);
foreach (var child in parent.Children.ToList())
{
   parent.Remove(child);
}

但這引發了同樣的異常,我不明白為什么,因為我認為我明確地告訴EF將孩子從父母中刪除。

有沒有一種方法可以從數據庫中刪除子級而無需直接在DbContext上訪問它們?

謝謝!

Guid是一個結構,而struct是不可空類型,例如原始類型。 例如: intdoublebool等。

您將可以使用以下代碼刪除給定父母的孩子

var parent = await _repository.GetById(parentId);
parent.Children.Clear();
foreach (var child in children)
{
     parent.Children.Add(child);
}

通過在子類Nullable中聲明您的Guid ParentId屬性,例如Nullable < Guid >

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM