Question

In ASP .NET MVC 3 with Entity Framework, I have a domain object which has a navigation property referencing another objects, as follows:

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

    public Guid CompanyID{get;set;}

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

When I create an instance of Person and try to add it to the database, the DBContext keeps a cache of this entity 'Person' and sends it to the database. So later on in the lifetime of the same context instance, when I try to access this entity, the Company field is always null since the navigation property never got updated.

Is there a way to update the navigation property with what exists in the database?

Lazy loading is turned on.

Was it helpful?

Solution

If lazy loading is turned on and you want to load the navigation property with lazy loading you must create a proxy of a new Person, not instantiate it with new, like 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
}

Without lazy loading you can use explicit loading:

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
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top