[英]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是不可空類型,例如原始類型。 例如: int , double , bool等。
您將可以使用以下代碼刪除給定父母的孩子
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.