2010-11-19 10 views
2

Ich verwende EF Code First mit einer bereits vorhandenen Datenbank.EF-Code Zuerst keine verwandten Objekte zurückgeben

Zwei Objekte:

public Foo 
{ 
    public int FooId {get;set;} 
} 

public Bar 
{ 
    public int BarId {get;set;} 
    public virtual Foo Foo {get;set;} 
} 

Sowohl FooId und BarId sind Primärschlüssel in der Datenbank und die Bar Tabelle hat eine Spalte FooId, die an der Foo Tabelle ein Fremdschlüssel Zeige ist.

Wenn ich eine Bar auswähle, ist Foo eine Nullreferenz. Ich hätte gedacht, EF hätte die beiden automatisch zusammengezogen, aber vielleicht verpasse ich etwas?

Datenbank-Mappings:

public class EFCodeFirst : DbContext 
{ 
    public EFCodeFirst() 
    { 
     this.Database.Connection.ConnectionString = ConfigurationManager.ConnectionStrings["AlternateString"].ConnectionString; 
    } 

    public DBSet<Foo> Foos {get;set;} 
    public DBSet<Bar> Bars {get;set;} 

    protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder) 
    { 
     modelBuilder.IncludeMetadataInDatabase = false; 
     modelBuilder.Entity<Foo>().MapSingleType().ToTable("Foo"); 
     modelBuilder.Entity<Bar>().MapSingleType().ToTable("Bar"); 
    } 
} 
+0

Können Sie auch Ihren Code zuerst Mapping posten? Was passiert, wenn Sie die Abfrage mit Include ("Foo") aufrufen? –

+0

Wenn ich 'Include (" Foo ")' es funktioniert. – mattdwen

Antwort

2

Wenn Ihre Erwartung von Foo nicht null sein soll, ist aus der Tatsache kommt, dass Sie es virtuellen auf Bar-Objekt zu machen, dann nicht der Fall, das ist. Indem Sie sie virtuell machen, wählen Sie einfach EF lazy loading und es wird null sein bis zu dem Punkt, dass Sie explizit danach fragen, indem Sie auf das Bar Objekt zugreifen. Anders als das, wenn Sie wollen, dass es im Voraus gefüllt wird, müssten Sie es mit Include Methode eifrig laden.

Um das Lazy Loading explizit zu deaktivieren, können Sie den folgenden Code verwenden, obwohl Sie ihn nicht benötigen, da Sie das virtuelle Schlüsselwort aus Ihren Navigationseigenschaften entfernen können.

public EFCodeFirst() 
{   
    this.ObjectContext.ContextOptions.LazyLoadingEnabled = false; 
} 

Intern verwendet DbContext einen geschützt Object, die Sie auch in Ihrer geerbt DbContext Klasse (z EFCodeFirst) verwenden können.

+0

Aber so oder so sollte es noch lösen, korrigieren? Entweder mit einem frühen oder späteren Aufruf an die DB. – mattdwen

+0

Ich kann auch nicht herausfinden, wann lazy loading zu deaktivieren. Keines der Objekte hat einen Verweis auf 'ContextOptions.LazyLoadingEnabled'. – mattdwen

+0

Ja das ist richtig und es funktioniert. Sie müssen uns den Code zeigen, der nicht funktioniert. –

0

Sie fehlen eine Zeile in der Foo-Klasse, die Foo enthält eine Sammlung von Bar.

+0

Es besteht derzeit keine Notwendigkeit, auf die Bar-Objekte vom übergeordneten Foo zuzugreifen. – mattdwen

+0

Ja, aber das ist es, was EF anweist, die Beziehung zu machen, ohne dass es Ihnen die Null-Referenz-Ausnahme gibt –

Verwandte Themen