在 EF Core 中添加对象列表会添加比现有条目更多的条目

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

我有一个包含子对象列表的父对象。普通的 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();
}

模型构建器中的 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 个。我的语法哪里错了?

一方面,完全没有必要手动持久化 child 实体。当您在其下创建 Parent 和新的 Child 实例并添加 Parent,然后调用 SaveChanges 时,children 将自动保留并且 FK将自动填充。此外,配置关系只需要在一侧完成。 IE。来自 parent 和 HasMany().WithOne(),或来自 child 和 HasOne().WithMany(),但不能两者兼而有之。

重复条目的典型原因是当您创建全新的引用、设置 PK 和 FK 并将这些实体添加到另一个集合并保存时。 EF 不会跟踪这些新实例,因此它将它们视为您期望和更新的插入。这看起来不是这里发生的事情,但可能是类似的事情,通过重置 ID EF 将这些视为导致 double-up 的新实例,因为如果 Parent 已经保存,child 记录也已经存在了。