我有一个我首先使用实体代码创建的数据库
在那个数据库中,我有一个类似于以下的结构
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 container 进行选择时,我可以检索 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 对象?