2016-03-22 19 views
3

Ich habe zwei Modellklassen erstellt: Student und Exam.Entity Framework 6 Lazy Loading funktioniert nicht

Student:

class Student 
{ 
    [Key] 
    public int StudentId { get; set; } 

    [Required, MaxLength(30)] 
    public string FirstName { get; set; } 

    [Required, MaxLength(50)] 
    public string LastName { get; set; } 

    [Required] 
    public DateTime BirthDate { get; set; } 

    public virtual ICollection<Exam> Exams { get; set; } 
} 

Prüfung:

public enum Grade 
{ 
    A, B, C, D, E, F 
} 
class Exam 
{ 
    [Key] 
    public int ExamId { get; set; } 

    [Required] 
    public Grade Grade { get; set; } 

    [ForeignKey("Student"), Required] 
    public int StudentId { get; set; } 

    public virtual Student Student { get; set; } 
} 

Aber es scheint, Lazy Loading-nicht funktioniert, hier ist beispielsweise, wie ich Daten abrufen:

using (var context = new StudentContext()) 
{ 
    context.Configuration.LazyLoadingEnabled = true; 
    context.Configuration.ProxyCreationEnabled = true; 

    var student = context.Students.Single(s => s.LastName == "ABC"); 

    foreach (var exam in student.Exams) 
    { 
     Console.WriteLine($"{exam.ExamId}: {exam.Grade}"); 
    } 
    context.SaveChanges(); 
} 

Und ich bekomme NullReferenceException wenn ich versuche, auf students.Exams Eigentum zuzugreifen. Was ist falsch in meinem Code?

Das Problem mit meinem Code ist, dass Entity Framework Lazy Loading funktioniert nicht und ich weiß nicht warum. Es geht nicht darum, Exams nicht zu initialisieren, weil Entity Framework es tun sollte allein, wenn ich versuche, auf Exams Eigenschaft zuzugreifen.

+0

@Nasreddine, nicht wirklich. Ich habe gelesen, dass EF während Lazy Loading sollte feststellen, ob Sammlung ist initialisiert oder nicht und initialisieren sie. Ich habe die Initialisierung im Konstruktor hinzugefügt, aber Lazy Loading funktioniert immer noch nicht. Jetzt, wenn ich versuche, Schülerprüfungen zu wiederholen (diese Prüfungen existieren in der Datenbank), bekomme ich keine Ausgabe. 'student.Exams' ist eine leere Sammlung, aber EF sollte sie laden. –

+0

@TomTom, @Rene Vogt, wie ist meine Frage ein Duplikat davon, wie man NRE repariert? Mein Problem ist, dass EF Lazy nicht funktioniert, nicht weil 'Exams' null ist, weil EF diese Sammlung selbst initialisieren soll. –

+0

@AlexanderDerck, Initialisierung der Sammlung im Konstruktor verhindert "NullReferenceException", aber die Sammlung ist leer, auch wenn ich in der Datenbank Prüfungen mit der ID eines bestimmten Schülers habe. Ich habe viele ähnliche Fragen gelesen, konnte meinen Code aber immer noch nicht verwenden. –

Antwort

10

Sie nicht folgen the rules Entity Framework zu ermöglichen Proxies zu erstellen (für verzögertes Laden erforderlich), die den Zugang der Öffentlichkeit benötigt:

Eine benutzerdefinierte Datenklasse muss mit offenem Zugang deklariert werden.

Machen Sie Ihre Exam und Student öffentlich und es sollte funktionieren.

+1

Möge Gott (respektive das fliegende Spaghetti Monster) dich segnen. – arminb

1

In C# wenn Sie keine Zugriffsmodifikatoren deklarieren, wird es standardmäßig als intern akzeptiert.

Sie sollten Ihre Entitätsklassen als public deklarieren.

Zweitens sollten Sammlungen leere Sammlung neben Null zurückgeben. Wenn ein Schüler keine Prüfung hat, sollten Sie die leere Sammlung zurückgeben. Das ist wyh Sie sollten auch Ihren Student Constructor ändern.

public class Student 
    { 
     public Student() 
     { 
      Exams = new List<Exam>(); 
     } 
    } 

Edit: Wenn Sie ICollection oder IList haben, ef leere Auflistung zurück. Sie sollten diesen Konstruktor verwenden, wenn Sie IEnumurable verwenden.

+2

Getestet und sogar ohne Konstruktor oder faule Initialisierung der Sammlung erhalten Sie eine leere Sammlung zurück.Ich denke, das wurde nur in alten Versionen von EF –

+0

benötigt. Ich wusste das nicht. Danke für die Information. –

Verwandte Themen