簡體   English   中英

實體框架延遲加載和更新模型

[英]Entity Framework lazy loading and updating model

我已經定義了一些這樣的模型(實體框架優先):

public class A
{
  public int Id { get; set; }
  public int Name { get; set; }
}

public class B
{
  public int Id { get; set; }
  public int Name { get; set; }
  public virtual A ObjectA { get; set; }
}

// model update sample code
public void UpdateModel(int id, string name)
{
  B objB = GetObjBByIdUsingLINQ(id); // this function gets the object using LINQ
  if (objB != null) // <-- if you do a breakpoint here and inspect objB, objB.A != null
  {
    objB.Name = name;
    dbContext.Entry(objB).State = EntityState.Modified;
    dbContext.SaveChanges(); // <-- DbEntityValidationException here because objB.A == null
  }
}

當我從數據庫中加載模型B時,我僅更改名稱並更新它,就會出現以下錯誤:ObjectA字段為必填字段。

我認為這是因為ObjectA是延遲加載的。 但是,當我從數據庫中加載B后添加斷點,然后在變量瀏覽器中查看B的內容時,將加載A,並且更新B不會出錯。

任何想法如何解決這個問題?

正在發生的事情是,當你在一個斷點停止,並檢查屬性的值ObjectA的內部objB ,你是明確的加載性能。

GetObjBByIdUsingLINQ(id)方法中,應使用Include來加載屬性,例如:

var objB = from b in dbContext.Bs.Include("ObjectA")
           where b.Id == id
           select b;

或者,您可以顯式加載屬性,而不是:

dbContext.Entry(objB).Reference("ObjectA").Load();

您應該注意,第一個選項只會打一次數據庫。 在第二個選項中,您將兩次訪問數據庫。 應根據您的具體情況考慮。
您可以在此博客文章中閱讀有關使用相關實體的全部信息: 在EF 4.1第6部分:加載相關實體中使用DbContext

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM