8

In ASP .NET MVC 3 mit Entity Framework zu aktualisieren, habe ich ein Domain-Objekt habe, die eine Navigationseigenschaft Referenzierung andere Objekte haben, wie folge:Wie ein Unternehmens Navigationseigenschaften in Entity Framework

public class Person 
{ 
    public String Name {get;set;} 

    public Guid CompanyID{get;set;} 

    [ForeignKey(CompanyID)] 
    public virtual CompanyType Company{ get; set; } 
} 

Wenn ich erstellen Wenn Sie eine Instanz von Person eingeben und versuchen, sie der Datenbank hinzuzufügen, behält der DBContext einen Cache dieser Entität "Person" bei und sendet ihn an die Datenbank. Später in der Lebensdauer der gleichen Kontextinstanz, wenn ich versuche, auf diese Entität zuzugreifen, ist das Feld Company immer Null, da die Navigationseigenschaft nie aktualisiert wurde.

Gibt es eine Möglichkeit, die Navigationseigenschaft mit dem zu aktualisieren, was in der Datenbank vorhanden ist?

Lazy Laden ist eingeschaltet.

Antwort

11

Wenn verzögertes Laden eingeschaltet ist und Sie die Navigationseigenschaft mit verzögertes Laden zu laden, müssen Sie einen Proxy eines neuen Person schaffen, nicht instanziiert es mit new, etwa so:

using (var context = new MyDbContext()) 
{ 
    var person = context.People.Create(); // creates a lazy loading proxy 
    person.CompanyID = 123; 
    context.People.Add(person); 
    context.SaveChanges(); 

    var company = person.Company; // lazy loading query happens here 
} 

ohne verzögertes Laden Sie können das explizite Laden verwenden:

using (var context = new MyDbContext()) 
{ 
    var person = new Person(); 
    person.CompanyID = 123; 
    context.People.Add(person); 
    context.SaveChanges(); 

    context.Entry(person).Reference(p => p.Company).Load(); // explicit loading 

    var company = person.Company; // no query anymore, Company is already loaded 
} 
+0

Dazu muss das Programm jede vorhandene Navigationseigenschaft explizit neu laden. Gibt es eine Möglichkeit, etwas Grundlegenderes zu implementieren, um alle Navigationseigenschaften für einen Entitätseintrag neu zu laden? Ich habe die Reload-Funktion für DbEntityEntry versucht, aber das scheint nicht zu funktionieren. – daniely

+0

@daniely: Nein, das ist nicht möglich. Die einzige Möglichkeit mit einem einzelnen DB-Rountrip wäre es, eifriges Laden mit mehreren 'Include's zu verwenden, um alle Navigationseigenschaften zu laden. Dies würde aber auch die übergeordnete Entität laden und Sie müssen die 'Include's für alle Navigationseigenschaften manuell schreiben. – Slauma

+0

@Slauma Bei der Verwendung von context.People.Include (p => p.NavProp1) .Include (p => p.NavProp2) Ich kann mehrere navigaton Eigenschaften kettenladen, die einen einzelnen Treffer in der DB erstellen. Gibt es eine ähnliche Möglichkeit, mehrere Navigationseigenschaften mit context.Entry (person) .Reference (...) zu laden? Ich kann keine Möglichkeit finden, alle Nav-Eigenschaften anzugeben, sodass ich Load() nur einmal aufrufen kann. –