9

在带有实体框架的 ASP .NET MVC 3 中,我有一个域对象,它具有引用另一个对象的导航属性,如下所示:

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

    public Guid CompanyID{get;set;}

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

当我创建 Person 的实例并尝试将其添加到数据库时,DBContext 会保留此实体“Person”的缓存并将其发送到数据库。因此,稍后在同一上下文实例的生命周期中,当我尝试访问此实体时,Company 字段始终为 null,因为导航属性从未更新。

有没有办法用数据库中存在的内容更新导航属性?

延迟加载已打开。

4

1 回答 1

11

如果打开了延迟加载,并且您想通过延迟加载加载导航属性,则必须创建一个 new 的代理Person,而不是用 实例化它new,如下所示:

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
}

如果没有延迟加载,您可以使用显式加载:

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
}
于 2012-05-10T23:05:53.047 回答