Asp.net-Mvc-3

如何在實體框架中更新實體的導航屬性

  • September 30, 2015

在帶有實體框架的 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,因為導航屬性從未更新。

有沒有辦法用數據庫中存在的內容更新導航屬性?

延遲載入已打開。

如果打開了延遲載入,並且您想通過延遲載入載入導航屬性,則必須創建一個 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
}

引用自:https://stackoverflow.com/questions/10542209