LINQ查询在实体数据库中嵌套的对象返回null

本文关键字:对象 返回 null 嵌套 查询 实体 数据库 LINQ | 更新日期: 2023-09-27 17:53:29

我首先使用实体代码创建了一个数据库

在该数据库中,我有一个类似于以下

的结构
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}
  ...
}
....

最后,我有了这些对象的上下文,其中包含查询DB的所有接口


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

当我创建DB并探索它时,我可以看到它的创建似乎是正确的:

在ClassA_Table中,我看到了ClassB_ID, ClassC_ID等的外键,以及封装在ClassA中的所有基本类型(int, string, bool, date等)

同样适用于:

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();

我再次探索DB,并在Table_A中看到一个新行,其中引用了B和C对象(行id对应于B_table, C_table中的对象)

我遇到的问题是,当我做一个选择从容器,我可以检索a对象,但嵌套的B和C对象是空的

基本类型是OK的(不是空的)

Some fixes I tried

virtual关键字是惰性的,因此在访问数据库的类的构造函数中,它做了

db.Configuration.ProxyCreationEnabled = false;

但是在做

一行时
A myA = db.As.Find(1);
A.some_text ; // not null
A.B ; //NULL!!!!
A.C ; // NULL

是什么导致实体框架不获取A和B对象?

LINQ查询在实体数据库中嵌套的对象返回null

您必须显式地使用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]);