linq查询为实体db中的嵌套对象返回null

时间:2013-01-16 11:16:03

标签: linq entity-framework lazy-loading

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

在那个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中的所有原始类型(整数,字符串,bool,日期等)

同样在执行以下内容时:

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对象?

1 个答案:

答案 0 :(得分:2)

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

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

在较新版本的Entity Framework中,围绕此方法还有wrapper method接受lambda表达式,避免使用字符串。

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