我有一个简单的控制器方法(通过 ajax),它将一个新实体插入到数据库中,然后在数据库中查询所有相同类型的记录并返回这些记录的列表(json)。
我想不通的是,当我插入第一条记录并查询我的记录列表时,任何子实体都不会延迟加载。但是,当我添加第二个或任意数量的后续记录时,我的列表包括所有按预期延迟加载的子实体。这是一些代码:
public class Person
{
public int Id {get;set;}
public string Name {get;set;}
public int StateId {get;set;}
public virtual State State {get;set;}
}
public class PersonController : Controller
{
public ActionResult CreatePerson(PersonModel model)
{
var person = model.ToPersonEntity();
_personService.InsertPerson(person);
var people = _personService.GetAllPeople();//on first person inserted this list does NOT have State loaded
var personAddresssList = people.Select(x => x.ToPersonAddressFormat());
return Json(personAddressList, JsonRequestBehavior.AllowGet);
}
}
实际上没有更多相关的代码,因为这是一个非常简单的操作。我通过在我的 linq 查询中使用 .Include(x => x.State) 解决了这个问题,但只要我的属性被标记为“虚拟”,我就不必这样做。
我能想到的唯一一件事是 EF 仍然将我的原始人作为跟踪实体,当我拉出人员列表并且唯一的人是我刚刚插入的人时,它使用了没有任何缓存的实体附加到它的子属性。如果这是真的,那么当我加载一个以上的人的列表时,EF 中的一些时髦的黑魔法会说“我在列表中看到 2 个项目,我不会使用我刚刚插入的缓存的人”。
有任何想法吗?