在 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 记录也已经存在了。
我有一个包含子对象列表的父对象。普通的 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 记录也已经存在了。