2012-04-02 17 views
0

Ich habe eine Frage in Bezug auf Fremdschlüssel in Entity Framework (EF4).Wie verschachtelte Fremdschlüssel Attribut mit Entity Framework

Können sagen, ich habe Klassen:

public class E1 
{ 
    public int Id{get;set;} 
    Public string name{get;set;} 
} 
public class E2 
{ 
    [ForeignKey("e1")] 
    public int E1Id{get;set;} 

    [ForeignKey("E1Id")] 
    public E1 e1{get;set;} 

} 
public class E3 
{ 
    [ForeignKey("e2")] 
    public int E2Id{get;set;} 

    [ForeignKey("E2Id")] 
    public E2 e2{get;set;} 
} 
public class E4 
{ 
} 

jeweils und ich denke, ich möchte das Attribut von class E1 in class E4 zugreifen, indem er über das Objekt von E3 Aufruf (die E2 ruft intern) sowie E2 Aufruf E1 als oben gezeigt, aber wenn ich versuche, auf das Attribut E1 zuzugreifen, wirft es object null reference Ausnahme also was ist der mögliche Weg, um die Attribute von E1 zu bekommen?

Antwort

1

Sie müssen entweder Eager-Laden, Lazy-Laden oder explizites Laden verwenden, um das Laden Ihrer Relation zu erzwingen.

Eager Laden wird Ihre Beziehungen sofort geladen werden, wenn Sie die Haupteinheit laden:

var e4 = context.E4Set.Include(e => e.E3.E2.E1).First(...); 

Lazy Loading Ihre Beziehungen transparent auf Anfrage lädt beim ersten Zugriff auf sie (es getrennte Datenbankabfrage für jeden Zugriff auf Navigation auslösen Eigentum). Damit dies funktioniert, müssen alle Navigationseigenschaften in allen Entitäten, die das verzögerte Laden unterstützen, virtual sein.

Explicit Laden fordert Sie bereits manuell geladen Einheit Laden auf auszuführen:

var e4 = context.EF4Set.First(...); 
var entry = context.Entry(e4); 
entry.Reference(e => e3).Load(); 

und Sie können es mit dem eifrigen Laden kombinieren:

entry.Reference(e => e3).Query().Include(e => e.E2.E1).Load(); 
Verwandte Themen