2016-04-20 14 views
0

Ich weiß, dass es andere gibt, die nach dem gleichen Problem gefragt haben, und die Antwort war, sich mit Referenzen und nicht mit IDs zu befassen.Das Hauptende der X-Beziehung kann nicht ermittelt werden. Mehrere hinzugefügte Entitäten können denselben Primärschlüssel haben

In meinem Fall habe ich ein seltsames Verhalten der Entity-Framework: Es funktioniert in einem Fall (Eltern-Kind), aber nicht in der anderen (Kind-Enkel).

Hier sind meine Modelle:

public class Parent 
{ 

    public int ID { get; set; } 
    public string Name { get; set; } 

    public List<Child> Children { get; set; } = new List<Child>(); 
} 


public class Child 
{ 

    public int ID { get; set; } 
    public int ParentID { get; set; }  
    public string Name { get; set; } 
    public List<GrandChild> GrandChildren { get; set; } = new List<GrandChild>(); 
    public Parent Parent { get; set; } 

} 

public class GrandChild 
{ 

    public int ID { get; set; } 
    public int ChildID { get; set; } 
    public String Name { get; set; }  
    public Child Child { get; set; }  

} 

Und hier ist mein Mapping:

public class ParentConfig : EntityTypeConfiguration<Parent> 
{ 
    public ParentConfig() 
    { 

     HasKey(e => e.ID); 
     Property(e => e.ID).HasColumnName("ID"); 
     Property(e => e.Name).HasColumnName("Name"); 
     HasMany(e => e.Children).WithRequired(c => c.Parent).HasForeignKey(c => c.ParentID); 

     ToTable("Parent"); 
    } 
} 

public class ChildMap : EntityTypeConfiguration<Child> 
{ 
    public ChildMap() 
    { 

     HasKey(e => e.ID); 

     Property(e => e.ID).HasColumnName("ID"); 
     Property(e => e.Name).HasColumnName("Name"); 
     Property(e => e.ParentID).HasColumnName("ParentID"); 

     HasMany(c => c.GrandChildren).WithRequired().HasForeignKey(c => c.ChildID); 
     HasRequired(e => e.Parent).WithMany().HasForeignKey(e => e.ParentID); 

     ToTable("Child"); 

    } 
} 


public class GrandChildMap : EntityTypeConfiguration<GrandChild> 
{ 
    public GrandChildMap() 
    { 
     HasKey(e => e.ID); 
     Property(e => e.ID).HasColumnName("ID"); 
     Property(e => e.ChildID).HasColumnName("ChildID"); 
     Property(e => e.Name).HasColumnName("Name"); 
     HasRequired(e => e.Child).WithMany().HasForeignKey(e => e.ChildID); 
     ToTable("GrandChild"); 
    } 
} 

Und hier ist mein Code:

 Parent parent = new Parent { Name = "Parent", }; 
     Child child_1 = new Child { Name = "Child 1", Parent = parent }; 
     Child child_2 = new Child { Name = "Child 2", Parent = parent }; 
     GrandChild grandChild_1 = new GrandChild { Name = "GrandChild 1", Child = child_2 }; 
     GrandChild grandChild_2 = new GrandChild { Name = "GrandChild 2", Child = child_2 }; 

      context.Parents.Add(parent); 

      //no need to call SaveChanges 

      context.Children.Add(child_1); 
      context.Children.Add(child_2); 

      //SaveChanges() is needed here 

      context.GrandChildren.Add(grandChild_1); 
      context.GrandChildren.Add(grandChild_2); 

      context.SaveChanges(); 

Dieser Code mit der Meldung

nicht

'Das Hauptende der Beziehung Child_GrandChildren konnte nicht ermittelt werden. Mehrere hinzugefügt Einheiten können den gleichen Primärschlüssel haben‘

Aber funktioniert, wenn ich nach dem Hinzufügen des Kindes retten, während ich SaveChanges() nach dem Hinzufügen der Eltern anrufen müssen.

EDIT: wenn ich die Eigenschaft List<GrandChild> GrandChildren entfernen, funktioniert es, aber ich brauche es wirklich.

Ist das ein Fehler?

Antwort

2

Sie benötigen eine Beziehung Konfiguration in ChildMap zu, dies zu ändern:

HasMany(c => c.GrandChildren).WithRequired(gc=>gc.Child).HasForeignKey(c => c.ChildID); 
    // the second one is not necessary, you already configure that relationship in ParentConfig 
    //HasRequired(e => e.Parent).WithMany().HasForeignKey(e => e.ParentID); 
+2

Entfernen Sie auch 'HasRequred (...)' Linie aus 'GrandChildMap' –

+0

Oh ich hatte nicht bis zum Ende gescrollt, es ist wahr, das OP konfiguriert die zweite Beziehung auch zweimal. Entfernen Sie die Beziehungskonfiguration von der' GrandChildMap' Klasse. Danke @IvanStoev – octavioccl

+0

Sie sind willkommen @octavioccl. Keine Notwendigkeit, Sie zu erwähnen, bekam meine +1 sowieso :) –

1

Sie müssen tun, so etwas werden:

parent.Children.Add(child1); 
parent.Children.Add(child2); 
child1.GrandChildren.Add(grandChild1); 
.... 
context.SaveChanges();