【问题标题】:How to update an entity's navigation properties in Entity Framework如何在实体框架中更新实体的导航属性
【发布时间】:2012-05-19 12:14:34
【问题描述】:

在带有实体框架的 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,因为导航属性从未更新。

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

延迟加载已开启。

【问题讨论】:

    标签: asp.net-mvc-3 entity-framework ef-code-first dbcontext navigation-properties


    【解决方案1】:

    如果开启了延迟加载,并且您想通过延迟加载来加载导航属性,您必须创建一个新的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
    }
    

    【讨论】:

    • 这要求程序显式地重新加载每个存在的导航属性。有没有办法实现更基本的东西,重新加载任何实体条目的所有导航属性?我尝试了 DbEntityEntry 的 Reload 功能,但这似乎不起作用。
    • @daniely:不,这是不可能的。单个 DB 往返的唯一方法是使用带有多个 Includes 的预加载来加载所有导航属性。但这也会加载父实体,您必须手动为所有导航属性编写 Includes。
    • @Slauma 使用 context.People.Include(p => p.NavProp1).Include(p=> p.NavProp2) 时,我可以链接加载多个导航属性,创建单个命中到数据库.是否有类似的方法可以使用 context.Entry(person).Reference(...) 加载多个导航属性?我想不出一种方法来指定所有导航属性,所以我只能调用一次 Load()。
    • @CristiDiaconescu:我认为不可能通过一次显式加载来加载所有子项。不过可以和单子导航属性一起加载孙子孙孙等,看这个问题的答案:stackoverflow.com/q/5966994/270591
    • 有没有办法以通用方式为所有导航属性执行context.Entry(person).Reference(p => p.Company).Load();
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多