EF很多很多单向添加相同的项目两次到子集合没有得到保存

时间:2015-12-10 03:27:30

标签: c# entity-framework many-to-many oneway

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

模特:

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对象的Parent对象,并尝试将相同id的新对象添加到子集合中,则DbContext不会检测到&#34;更改并且不会在映射表中添加新条目。 但是如果我添加一个新的孩子(在该集合中不存在),它确实会被添加好。

例如:

{  
   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,这很好。但保存更改不会添加该项目。如果我再次使用上下文从db中检索它,它只返回集合中的1个元素。

任何想法都很好。

1 个答案:

答案 0 :(得分:0)

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

  • 一个孩子,Id =“cbd5bccc-b977-4861-870d-089994958cdf”
  • 一位家长,Id =“the-parent-id”
  • 两个 ParentToChildMappings,两者都有ParentId =“the-parent-id”和ChildId =“cbd5bccc-b977-4861-870d-089994958cdf”

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