簡體   English   中英

識別和刪除實體框架子記錄

[英]Identifying and Deleting Entity Framework child records

我在EF中定義了以下對象;

public class ItemA()
{
        public virtual ICollection<ItemB> Items{ get; set; }
}

public class ItemB()
{
        public virtual ICollection<ItemC> Items{ get; set; }
}

在我的代碼中,我正在做以下事情;

myItemA.Items.Remove(myItemA.Items.FirstOrDefault(x => (int)x.Type == model.Type));

myItemA.Items.Add(new ItemB());

當填充ItemA的實例時,它包含單個ItemB,我只想將其替換為ItemB的新實例。 當我進入我的服務更新消息時,我注意到只是調用以下代碼導致新的ItemB,並且現有的ItemB變為孤立狀態,父ID為null。 ItemB和ItemC之間的鏈接完好無損。

_dbContext.Entry(entity).State = EntityState.Modified;
_dbContext.SaveChanges();

因此,我知道我需要告訴EF要刪除子ItemB,並且模型中的約束設置有望級聯刪除子ItemC記錄,然后刪除孤立的ItemB。 但是,我正在努力尋找一種方法。

我嘗試從上下文中重新獲取Parent ItemA以比較List並將它們標記為已刪除,但是當我收回代理時,兩個對象基本相同,只有更新的ItemB而不是原始的。

var existingItem = GetItem(entity.Id);

要么

var existing Items = GetItem(entity.Id).Items.ToList();

所以我需要的是原始的ItemA.Items能夠告訴EF他們將被刪除。 請注意,我知道如何告訴EF應刪除某些內容,我只對獲取應該刪除的實體的引用感興趣。

編輯

添加此代碼使其工作,孤立的ItemB(帶有子ItemC)現在被刪除,但據我所知,現在將在2個事務中完成。

    //Update Message
    _dbContext.Entry(entity).State = EntityState.Modified;
    _dbContext.SaveChanges();

    //Remove any orphaned records
    var itemsToRemove = _dbContext.Set<ItemB>().Where(x => x.ItemA == null).ToList();
    _dbContext.Set<ItemB>().RemoveRange(itemsToRemove );
    _dbContext.SaveChanges();

理想情況下,尋找一種方法來執行此單個SaveChanges()

嗯..我明白了什么不對,或者你只是想實現這樣的級聯刪除:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<ItemB>().HasRequired(b => b.Parent).WithMany(a => a.Items).WillCascadeOnDelete();
}

這應該也有效:

public class ItemA()
{
    public virtual ICollection<ItemB> Items{ get; set; }
}

public class ItemB()
{
    [Required] // This set's the constraint
    public virtual ItemA Parent { get; set; }
    public virtual ICollection<ItemC> Items{ get; set; }
}

然而,沒有使用第二個,但它應該具有相同的結果。

暫無
暫無

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

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