2013-10-28 5 views
19

Ich versuche, einen Test in EF, erstellen eine viele zu viele Beziehung, weil ich immer eins zu eins oder eins zu vielen zuordnen, habe ich ein Beispiel im Internet bekommen für Versuch, arbeitet das Beispiel für Einsatz Register, aber ich kann Register nicht meine Klassen lesenMapping viele zu viele Beziehung in Entität Rahmencode zuerst

Hier ist, weiß ich nicht, was HashSet ist, dass ich diesen Code auf der Website erhalten

public class Person 
{ 
    public int PersonId { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    public ICollection<Course> CoursesAttending { get; set; } 

    public Person() 
    { 
     CoursesAttending = new HashSet<Course>(); 
    } 
} 

public class Course 
{ 
    public int CourseId { get; set; } 
    public string Title { get; set; } 

    public ICollection<Person> Students { get; set; } 

    public Course() 
    { 
     Students = new HashSet<Person>(); 
    } 
} 

Hier ist mein Kontext

public class SchoolContext : DbContext 
{ 
    public DbSet<Course> Courses { get; set; } 
    public DbSet<Person> People { get; set; } 

    public SchoolContext() 
     : base("MyDb") 
    { 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Course>(). 
      HasMany(c => c.Students). 
      WithMany(p => p.CoursesAttending). 
      Map(
       m => 
       { 
        m.MapLeftKey("CourseId"); 
        m.MapRightKey("PersonId"); 
        m.ToTable("PersonCourses"); 
       }); 

    } 
} 

Wenn ich Register einzufügen ist rechts

static void Main(string[] args) 
{ 
    using (SchoolContext db = new SchoolContext()) 
    { 
     Course math = new Course(); 
     Course history = new Course(); 
     Course biology = new Course(); 
     math.Title = "Math"; 
     history.Title = "History"; 
     biology.Title = "Biology"; 

     db.Courses.Add(math); 
     db.Courses.Add(history); 
     db.Courses.Add(biology); 

     Person john = new Person(); 
     john.FirstName = "John"; 
     john.LastName = "Paul"; 
     john.CoursesAttending.Add(history); 
     john.CoursesAttending.Add(biology); 

     db.People.Add(john); 
     db.SaveChanges(); 
    } 
} 

Aber wenn ich wählen Sie Register zum Inhalt zeigen versuchen, arbeiten nicht, drucken Sie es einfach nichts

static void Main(string[] args) 
{ 
    using (SchoolContext db = new SchoolContext()) 
    { 
     Pearson p = db.Peasons.First(); 
     Console.WriteLine(p.CoursesAttending.First().Title); 
    } 
} 

ich in der Datenbank überprüfen hatte, Register vorhanden sind, Was ist das Problem?

Bitte lehren Sie mir, wie in vielen zu vielen Beziehung mit Code zuerst zu machen.

+0

Wenn Sie '.Add()' auf Navigationseigenschaften in einer Viele-zu-viele-Beziehung verwenden, aktualisiert EF automatisch eine entsprechende gemeinsame Tabelle? – Celdor

+0

@Celdor EF aktualisiert die entsprechende Join-Tabelle natürlich. – IFink

Antwort

33

First off, können Sie die Sammlungen verzögertes Laden aktivieren möchten können virtuelle indem:

public virtual ICollection<Course> CoursesAttending { get; set; } 
public virtual ICollection<Person> Students { get; set; } 

Dies ermöglicht EF abgeleiteten Klassen zu erstellen (Proxies) von Course und Person, die die Sammlungen außer Kraft setzen mit Logik, um ihre Daten aus dem Datenspeicher zu laden.

Wenn Sie das tun, werden Sie sehen, dass

Console.WriteLine(p.CoursesAttending.First().Title); 

eine separate Abfrage ausführen CoursesAttending zu füllen.

Alternativ oder zusätzlich können Sie sich entscheiden, die Datenbank von eifrig Laden wie so Umläufe zu verhindern:

Person p = db.Persons.Include(p => p.CoursesAttending).First(); 

, die die Personund die CoursesAttending in einem Schuss lädt.

+0

Großartig! Es ist Arbeit!! Also ... warum Include für die Schnellauswahl verwendet? Ich verstehe nicht, wie man Include – Lai32290

+1

verwendet Wie das Wort sagt, 'Include' enthält Eigenschaften in die Abfrage. In der Regel ist es effizienter, eine SQL-Abfrage (mit Joins) zu verwenden, als Objekte in späteren Abfragen abzurufen und die zugeordneten Objekte später abzufragen. –

-1

Entfernen Sie den Klassenkonstruktor und die OnModelCreating-Methode. EF behandelt viele zu viele Beziehung. Sie müssen nichts extra tun.

+6

Die Verwendung von Datenannotationen kann Ihnen standardmäßig eine funkige Namenskonvention geben und durch die Bereitstellung des flüssigen AIP-Codes kann diese unerwünschte Benennung vermieden werden. –

+0

Diese Antwort ist IMO OT und überhaupt nicht hilfreich. – Celdor