Class A{
public int ID{get;set;}
public string s{get;set;}
}
Class B{
public int aID { get; set; }
[ForeignKey("aID")]
public A a { get; set; }
public int ID{get;set;}
public string s{get;set;}
}
using(var context =new XXXXDbContext())
{
//此时bList 集合当中的每一个 a对象 里面对象 A 是为null,是没有任何问题
var bList =context.BBBs.Where(C=>C.aID=2).ToList();
//但是如果此时在 查询 A对象 ID=2的, 上面bList 里面的A 对象就有值了,这是为什么呢?而且,我也观察了,这两条代码执行出的sql 语句,都是单表查询的
var aList= context.AAAs.Where(C=>C.ID).FirstOrDefault();
}
//用了 AsNoTracking()当可以解决,这个问题,但是原因是什么呢? 麻烦哪位大神,能够解释一下,非常感谢
ef的懒加载功能。
查询出b对象的时候,其实a对象还没有值。你在调试的时候点开对象看的时候才从数据库加载a对象。
我没有点开调试对象,一旦执行第二条代码时,就会加载A对象,那我该如何避免这种情况出现呢。
@K-Show:
没有点开调试对象,一旦执行第二条代码时。怎么看出来的呢?跟踪sql?
懒加载 a对象加个virtual
你是在 Vistual Studio 调试器中观察的吧?
感觉像是同一个数据上下文对象里面自己关联的,我对EF不是很熟,但觉得是EF认为你在加载bList 下面A对象的数据。