我的数据库中有一个人员和职业表。当我创建一个人员时,他们的默认职业ID为空。
假设我创建了一个人,他们的 ID 是 11。此外,还有一个职业,假设潜水员,其 Id 是 53。然后,我执行以下操作:
using (var context = new DbEntities())
{
person.OccupationId; //currently null
person.Occupation; //currently null
var person = context.People.First(x => x.Id == 11);
person.OccupationId=53;
context.SaveChanges();
var occupation = person.Occupation.Description; //Exception: Occupation is null
}
代码在最后一行失败,因为占用最初为 null,并且在保存后不会延迟加载新占用。如果此人在运行此代码之前有职业,并且旧职业是延迟加载的,则新职业将在保存后出现。
换句话说,如果这个人首先拥有看门人的职业,那么这将起作用:
using (var context = new DbEntities())
{
var person = context.People.First(x => x.Id == 11);
var occupation = person.Occupation.Description; //this would say Janitor
person.OccupationId=53;
context.SaveChanges();
var occupation = person.Occupation.Description; //This would say Diver
}
如果初始职业为空,有没有办法在保存后延迟加载新的职业?
我对这个问题并不完全清楚,但这里有一个镜头:
public class People
{
private Occupation occupation = null;
public Occupation Occupation
{
get { return this.GetOccupation(); }
set { this.occupation = value; }
}
private Occupation GetOccupation()
{
return this.GetOccupation(false);
}
private Occupation GetOccupation(bool force)
{
if(this.occupation == null || force)
{
using (var context = new DbEntities())
{
this.occupation = context.Occupation.First(x => x.Id == this.OccupationId);
}
}
return this.occupation;
}
}
下面是一个具有强制重新加载功能的延迟加载的简单示例。
在 SaveChanges() 中,你可以调用它。职业 = 空;下次有人访问它时,它将延迟加载它。或者,你可以称之为。获取职业(真);这将强制重新加载职业,但这有点违背了延迟加载的目的。(IE.只在需要时加载某些内容)
我最终使用了这个:
if(person.Occupation==null && person.OccupationId!=null)
context.Entry(person).Reference(x=>x.Occupation).Load();
我确信有一种方法可以在保存后自动加载职业,但我的尝试还没有运气。