0

Désolé, d'abord disons que j'ai essayé de rechercher ce problème en ligne et il y en a quelques-uns mais aucun spécifiquement lié à mon scénario. J'ai passé deux heures et je ne pouvais pas comprendre.Impossible de déterminer la fin principale de la relation, Plusieurs entités ajoutées peuvent avoir la même clé primaire

Je posterai mon code ci-dessous, dépouillant toutes les informations non pertinentes

Tout d'abord, voici mes cours

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 ... 
} 

Mappages:

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

Ensuite, le code, ici, je suis en train de créer plusieurs nouveaux StudentParents, chacun avec son propre parent, à un étudiant.

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 

Je reçois ce message:

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

Cela ne se produit que lorsque je tente d'ajouter plus de 1 StudentParent à la fois. Je ne suis pas sûr pourquoi le nombre de StudentParents serait important? Je pense que j'ai les relations établies correctement.

Il fonctionne également avec l'ajout de plusieurs StudentGrades, mais la différence est que le modèle StudentGrade est plat (n'a pas un enfant comme StudentParent a un parent)

Répondre

0

Comme personne n'a répondu. Je vais poster ce que j'ai découvert au cas où ça pourrait aider quelqu'un.

En StudentParentMap, ajoutez

m => m.Parent 

tels que

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

Je ne sais pas pourquoi cela importait .. la cartographie semblait assez suffisante pour que le code-première relation de base de données généré n'a pas changé avec cette nouvelle addition. Toutefois, EF devait déterminer comment configurer FK lors d'une transaction d'ajout de plusieurs enregistrements. C'était assez subtil pour moi.