8

w ASP .NET MVC 3 z Entity Framework Mam obiektu domeny, która ma właściwości nawigacji odsyłania kolejne obiekty, co następuje:Jak zaktualizować właściwości nawigacyjnych jednostki w Entity Framework

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

    public Guid CompanyID{get;set;} 

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

Kiedy tworzę instancji osoby i spróbować dodać ją do bazy danych, DBContext przechowuje pamięć podręczną tego obiektu "Person" i wysyła go do bazy danych. Tak więc w późniejszym okresie istnienia tej samej instancji kontekstu, gdy próbuję uzyskać dostęp do tego elementu, pole Firma zawsze ma wartość null, ponieważ właściwość nawigacji nigdy nie została zaktualizowana.

Czy istnieje sposób na aktualizację właściwości nawigacji za pomocą tego, co istnieje w bazie danych?

Leniwe ładowanie jest włączone.

Odpowiedz

11

Jeśli leniwy ładowania jest włączona i chcesz wczytać właściwość nawigacji z leniwe załadunku należy utworzyć proxy nowego Person, nie oznacz ją z new, tak:

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 
} 

Bez leniwe załadunku można użyć jawnego ładowania:

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

Wymaga to od programu jawnego przeładowania każdej istniejącej właściwości nawigacji. Czy istnieje sposób na wdrożenie czegoś bardziej podstawowego, aby przeładować wszystkie właściwości navigatio dla dowolnego wpisu jednostki? Próbowałem funkcji przeładowania dla DbEntityEntry, ale to nie działa. – daniely

+0

@daniely: Nie, to niemożliwe. Jedynym sposobem na użycie pojedynczego DB rountrip byłoby użycie szybkiego ładowania z wieloma 'Include's, aby załadować wszystkie właściwości nawigacji. Ale to również załadowałoby jednostkę nadrzędną i musicie ręcznie wpisać "Uwzględnij" dla wszystkich właściwości nawigacyjnych. – Slauma

+0

@Slauma Przy użyciu context.people.Include (p => p.NavProp1) .Include (p => p.NavProp2) Mogę załadować kilka właściwości nawigacyjnych, tworząc pojedyncze trafienie do bazy danych. Czy istnieje podobny sposób załadowania kilku właściwości nawigacji z kontekstem.Entry (osoba) .Reference (...)? Nie mogę znaleźć sposobu na określenie wszystkich właściwości nav, więc mogę tylko wywołać Load() raz. –

Powiązane problemy