Reputation: 7733
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
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