EF 多对多单向将同一项添加到子集合两次不会保存

本文关键字:子集合 两次 保存 添加 一项 EF | 更新日期: 2023-09-27 18:26:16

感谢花时间阅读本文。我已经在寻找这个问题的答案一个星期了,但我的想法已经用完了......这是场景:

模型:

public class Parent{
    public Guid Id {get;set;}
    public virtual ICollection<Child> ChildCollection{ get; set; }
}
public class Child {
    public Guid Id {get;set;}
    public string Name{get;set}
}

在模型创建时:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Parent>()
            .HasMany(c => c.ChildCollection)
            .WithMany()
            .Map(x =>
            {
                x.ToTable("ParentToChildMapping");
                x.MapLeftKey("ParentId");
                x.MapRightKey("ChildId");
            }); 
}

现在的问题是:

如果我在集合中有一个带有 Child 对象的父对象,并尝试将具有相同 id 的新对象添加到子集合中,则 DbContext 不会"检测"更改,也不会在映射表中添加新条目。但是,如果我添加一个新的孩子(集合中不存在(,它确实可以添加。

例如:

{  
   var childId = Guid.Parse("cbd5bccc-b977-4861-870d-089994958cdf");
   var parent = new Parent { ChildCollection = new HashSet<Child>() };
   var context = new DBContext();
   var child = context.Childs.Single(c=>c.Id=childId);
   parent.ChildCollection.Add(child);
   context.Parents.Add(parent);
   context.SaveChanges();
}

然后:

{
   var childId = Guid.Parse("cbd5bccc-b977-4861-870d-089994958cdf");
   var context = new DBContext();
   var parent = dbContext.Parents.Include(p=>p.ChildCollection).Single(p=>p.Id=parentId); // The id saved in the point before.
   var child = context.Childs.Single(c=>c.Id=childId);
   parent.ChildCollection.Add(child);
   // At this point parent.ChildCollection.Count() = 2
   context.SaveChanges();
}       

集合的计数为 2,这很好。但保存更改不会添加项目。如果我再次使用上下文从数据库中检索它,它只返回集合中的 1 个元素。

任何想法都是好的。

EF 多对多单向将同一项添加到子集合两次不会保存

您尝试将同一个孩子添加到父级两次,但这不起作用。如果您成功了,您最终会在数据库中得到类似以下内容的内容:

  • 一个孩子,ID = "cbd5bccc-b977-4861-870d-089994958cdf">
  • 一个父级,Id = "父级 id">
  • 两个 ParentToChildMappings,都有 ParentId = "the-parent-id" 和 ChildId = "cbd5bccc-b977-4861-870d-089994958cdf">

对于关系数据库,这是不允许的,因为 (ParentId, ChildId( 是 ParentToChildMap 的主键,并且表中的两行不能具有相同的主键。