0

Извините, сначала позвольте мне сказать, что я попытался найти эту проблему в Интернете, и есть некоторые, но не связанные с моим сценарием. Я провел пару часов и не мог понять.Невозможно определить главный конец отношения. Несколько добавленных объектов могут иметь один и тот же первичный ключ

Я пост моего кода ниже, зачистка всей ненужной информации

Первого, вот мои классы

public class StudentDm 
{ 
    public int Id { get; set; } 
    public virtual List<StudentParentDm> StudentParents { get; set; } 

    // other properties ... 
} 

// constructs a many to many relationship with some additional info in this model 
public class StudentParentDm : EntityBaseDm 
{ 
    public int Id { get; set; } 
    public int StudentId { get; set; } 
    public virtual StudentDm Student { get; set; } 
    public int ParentId { get; set; } 
    public virtual ParentDm Parent { get; set; } 

    // other properties ... 
} 

public class ParentDm 
{ 
    public int Id { get; set; } 

    // other properties ... 
} 

Отображение:

public StudentMap() 
{ 
    HasMany(m => m.StudentParents).WithRequired().HasForeignKey(m => m.StudentId).WillCascadeOnDelete(false); 
} 

public StudentParentMap() 
{ 
    HasRequired(m => m.Student).WithMany().HasForeignKey(m => m.StudentId).WillCascadeOnDelete(false); 
    HasRequired(m => m.Parent).WithMany().HasForeignKey(m => m.ParentId).WillCascadeOnDelete(false); 
} 

public ParentMap() 
{ 
    HasMany(m => m.StudentParents).WithRequired().HasForeignKey(m => m.ParentId).WillCascadeOnDelete(false); 
} 

Тогда код, здесь я пытаюсь создайте для ученика несколько новых учеников, каждый со своим новым родителем.

foreach (StudentParentDm studentParent in studentParents) // foreach new studentParent 
{ 
    StudentParentDm trackedStudentParent; 
    if (studentParent.Id == 0) 
    { 
     trackedStudentParent = new StudentParentDm 
     { 
      Parent = new ParentDm() 
     }; 

     // map from studentParent to trackedStudentParent, including the Parent 
     // ... 

     trackedStudent.StudentParents.Add(trackedStudentParent); 
    } else 
    { 
     // unimportant 
    } 
} 

unitOfWork.Commit() // blows up with error message 

Тогда я получаю сообщение:

Unable to determine the principal end of the 'Cobro.BusinessObjects.DatabaseContextServices.ParentDm_StudentParents' relationship. Multiple added entities may have the same primary key. 

Это происходит только тогда, когда я пытаюсь добавить более 1 StudentParent в то время. Я не уверен, почему было бы важно число учеников? Я думаю, что у меня правильные отношения.

Он также работает с добавлением нескольких StudentGrades, но разница в том, что StudentGrade модель является плоской (не имеет ни одного ребенка, как StudentParent имеет Parent)

ответ

0

Поскольку никто не ответил. Я должен опубликовать то, что я обнаружил, если он может помочь кому угодно.

В StudentParentMap, добавьте

m => m.Parent 

таким образом, что

HasMany(m => m.StudentParents).WithRequired(m => m.Parent).HasForeignKey(m => m.ParentId).WillCascadeOnDelete(false); 

Не знаю, почему это имело значение .. отображение казалось, достаточно достаточно, так что код-первых генерироваться отношения базы данных не изменились с этим новый дополнение. Однако EF необходимо было выяснить, как настроить FK во время транзакции с несколькими записями. Это было довольно тонко для меня.