daniely
daniely

Reputation: 7733

How to update an entity's navigation properties in Entity Framework

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.

Upvotes: 9

Views: 6369

Answers (1)

Slauma
Slauma

Reputation: 177133

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
}

Upvotes: 11

Related Questions