簡體   English   中英

在 EF Core 中添加對象列表會添加比現有條目更多的條目

[英]Adding list of objects in EF Core is adding more entries than exist

我有一個父 object,它有一個子 object 列表。 普通的 POCO,沒什么特別的。 EF 語法是一對多的。

在我的 dbcontext 中,我有以下內容:

if (parent.childObjectList.Any())
{
    foreach (var x in parent.childObjectList)
    {
       x.Id = 0;
       x.ParentId = parent.Id;
    }    
    parent.childObjectList.ForEach(n => _context.ChildObjects.Add(n));
    await _context.SaveChangesAsync();
}

model 構建器中的 EF 語法:

 entity.HasMany(p => p.ChildObject)
               .WithOne(e => e.Parent)
               .HasForeignKey(p => p.ParentId)
               .OnDelete(DeleteBehavior.Restrict);

在子 EF 語法中:

entity.HasOne(x => x.Parent)
                .WithMany(x => x.ChildObject)
                .HasForeignKey(x => x.ParentId)
                .OnDelete(DeleteBehavior.NoAction);

當我運行它時,如果列表中有兩個子對象,則會在數據庫中創建 4 個條目。 如果列表中有 3 個,則創建 6 個。 我的語法哪里錯了?

一方面,手動持久化子實體是完全沒有必要的。 當您在其下創建 Parent 和新的 Child 實例並添加 Parent 時,然后調用SaveChanges ,子級將自動持久化,並且 FK 將自動填充。 此外,配置關系只需要在一側完成。 即來自具有HasMany().WithOne()的父母,或來自具有HasOne().WithMany()的孩子,而不是兩者。

雙重輸入的典型原因是當您創建全新的引用、設置 PK 和 FK 並將這些實體添加到另一個的集合和保存時。 EF 不會跟蹤這些新實例,因此它將它們視為您期望和更新的插入。 這看起來不是這里發生的事情,但可能是類似的事情,通過重置 ID EF 將這些視為導致雙倍的新實例,因為如果已經保存了父記錄,那么子記錄也已經保存了。

暫無
暫無

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

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