1

我的数据库中有一个人员和职业表。当我创建一个人时,他们的默认 OccupationId 为空。

假设我创建了一个人,他们的 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
}

代码在最后一行失败,因为职业最初为空,并且新职业在保存后没有延迟加载。如果此人在运行此代码之前有一个职业,并且旧的职业是延迟加载的,那么新的职业将在保存后出现。

换句话说,如果该人首先拥有清洁工职业,那么这将起作用:

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
}

如果初始职业为空,是否有办法在保存后延迟加载新职业?

4

2 回答 2

1

我对这个问题并不完全清楚,但这里是镜头:

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() 你可以调用 this.Occupation = null; 下次有人访问它时,它会延迟加载它。或者,您可以调用 this.GetOccupation(true); 这将强制重新加载职业,但这有点违背延迟加载的目的。(即,仅在需要时加载某些内容)

于 2012-06-28T07:22:23.673 回答
0

我最终使用了这个:

if(person.Occupation==null && person.OccupationId!=null)
     context.Entry(person).Reference(x=>x.Occupation).Load();

我确信有一种方法可以在保存后自动加载职业,但我的尝试还没有运气。

于 2012-06-28T07:50:37.417 回答