EF многие ко многим одним способом добавить один и тот же элемент дважды в дочернюю коллекцию не сохраняется

Спасибо, что нашли время, чтобы прочитать это. Я уже неделю ищу ответ на эту проблему, и у меня заканчиваются идеи... Это сценарий:

Модель:

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");
            }); 
}

Теперь проблема:

Если у меня есть родительский объект с дочерним объектом в коллекции, и я пытаюсь добавить новый объект с таким же идентификатором в дочернюю коллекцию, DbContext не "обнаруживает" изменение и не добавляет новую запись в таблицу сопоставления. Но если я добавлю нового Child (которого нет в коллекции), он будет добавлен нормально.

Например:

{  
   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 элемент в коллекции.

Любые мысли приветствуются.

1 ответ

Решение

Вы пытаетесь добавить одного и того же ребенка к родителю дважды, и это не сработает. Если вы добились успеха, вы получите что-то вроде следующего в базе данных:

  • один ребенок, Id = "cbd5bccc-b977-4861-870d-089994958cdf"
  • один родитель, Id = "родитель-идентификатор"
  • два ParentToChildMappings, оба имели ParentId = "the-parent-id" и ChildId = "cbd5bccc-b977-4861-870d-089994958cdf"

что недопустимо для реляционной базы данных, поскольку (ParentId, ChildId) является первичным ключом ParentToChildMapping, и две строки в таблице не могут иметь один и тот же первичный ключ.

Другие вопросы по тегам