簡體   English   中英

LINQ 查詢為實體數據庫中的嵌套對象返回 null

[英]LINQ query returning null for nested objects in Entity DB

我首先使用實體​​代碼創建了一個數據庫

在那個數據庫中,我有一個類似於以下的結構


class ClassA
{
  public virtual int ID {get;set}
  public virtual string some_text {get;set}
  public virtual ClassB B {get;set}
  public virtual ClassC C {get;set}
  ...
}

class ClassB
{
  public virtual int ID {get;set}
  public virtual string some_text {get;set}
  public virtual string some_values {get;set}
  ...
}

class ClassC
{
  public virtual int ID {get;set}
  public virtual string some_text {get;set}
  public virtual string some_values {get;set}
  ...
}
....

最后,我為那些具有所有接口的對象提供了一個上下文來查詢數據庫


public class ClassADb : DBContext, IClassADataSource
{
  public DBSet<ClassA> As {get;set}
  public DBSet<ClassB> Bs {get;set}
  public DBSet<ClassC> Cs {get;set}
  ...
}

當我創建數據庫並探索它時,我可以看到它的創建似乎是正確的:

在 ClassA_Table 中,我看到 ClassB_ID、ClassC_ID 等的外鍵以及封裝在 ClassA 中的所有原始類型(整數、字符串、布爾值、日期等)

同樣在執行以下操作時:

ClassB MyB = new ClassB();
//some code to initialize B
...
Bs.Add(MyB)

ClassC MyC = new ClassC();
//some code to initialize C
Cs.Add(MyC);

ClassA MyA = new ClassA();

A.B = MyB;
A.C = MyC;
...

db.SaveChanges();

我再次探索數據庫並在 Table_A 中看到一個新行,其中包含對那些 B 和 C 對象的引用(行 ID 對應於 B_table 、C_table 中的那些對象)

我遇到的問題是,當我從 As 容器中進行選擇時,我可以檢索 A 對象,但嵌套的 B 和 C 對象為空

原始類型正常(非空)

我嘗試過的一些修復

virtual關鍵字是惰性的,所以在訪問數據庫的類的構造函數中我做了

db.Configuration.ProxyCreationEnabled = false;

但仍然在做一些事情時

A myA = db.As.Find(1);

A.some_text ; // not null
A.B ; //NULL!!!!
A.C ; // NULL

是什么導致實體框架不獲取 A 和 B 對象?

您必須使用Include()顯式加載相關實體。

db.As.Include("B").Include("C").Where(a => [some condition]);

在較新版本的實體框架中,此方法還有一個包裝方法,該方法接受 lambda 表達式,避免使用字符串。

db.As.Include(a => a.B).Include(a => a.C).Where(a => [some condition]);

暫無
暫無

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

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