gpt4 book ai didi

c# - LINQ 查询为实体数据库中的嵌套对象返回 null

转载 作者:行者123 更新时间:2023-12-02 05:17:50 24 4
gpt4 key购买 nike

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

在那个数据库中我有一个类似于下面的结构


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}
...
}
....

最后,我为那些具有查询数据库的接口(interface)的对象提供了上下文


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

是什么导致 Entity Framework 无法获取 A 和 B 对象?

最佳答案

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

关于c# - LINQ 查询为实体数据库中的嵌套对象返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14357095/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com