LINQ 查询为 Entity DB 中的嵌套对象返回 null

Avn*_*arr 2 c# linq entity-framework lazy-loading

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

在该数据库中,我的结构类似于以下内容


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}
  ...
}
....
Run Code Online (Sandbox Code Playgroud)

最后,我有了这些对象的上下文以及查询数据库的所有接口


public class ClassADb : DBContext, IClassADataSource
{
  public DBSet<ClassA> As {get;set}
  public DBSet<ClassB> Bs {get;set}
  public DBSet<ClassC> Cs {get;set}
  ...
}
Run Code Online (Sandbox Code Playgroud)

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

在 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();
Run Code Online (Sandbox Code Playgroud)

我再次探索数据库,并在 Table_A 中看到一个新行,其中引用了 B 和 C 对象(行 ID 对应于 B_table 、 C_table 中的那些对象)

我遇到的问题是,当我从 As 容器中进行选择时,我可以检索 A 对象,但嵌套的 B 和 C 对象为 null

基本类型没问题(不为空)

我尝试过的一些修复

关键字virtual是惰性的,所以在访问数据库的类的构造函数中我做了

db.Configuration.ProxyCreationEnabled = false;
Run Code Online (Sandbox Code Playgroud)

但仍然在做类似的事情时

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

A.some_text ; // not null
A.B ; //NULL!!!!
A.C ; // NULL
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*ner 5

您必须使用 显式加载相关实体Include()

db.As.Include("B").Include("C").Where(a => [some condition]);
Run Code Online (Sandbox Code Playgroud)

在较新版本的实体框架中,还有一个围绕此方法的包装方法,接受 lambda 表达式,避免使用字符串。

db.As.Include(a => a.B).Include(a => a.C).Where(a => [some condition]);
Run Code Online (Sandbox Code Playgroud)