id更新后实体框架延迟加载

时间:2012-06-28 07:00:36

标签: c# entity-framework lazy-loading

我的数据库中有一个Person and Occupation表。当我创建Person时,它们的默认OccupationId为空。

让我们说我创造了一个人,他们的身份证是11.另外,有一个职业,让我们说潜水员,它的身份证是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
}

如果初始占用为空,有没有办法在保存后延迟加载新占用?

2 个答案:

答案 0 :(得分: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()中你可以调用它.Occupation = null;下次有人访问它时,它将延迟加载它。 或者,你可以称之为.GetOccupation(true);这将强制重新加载占领,但那就是有点挫败懒惰加载的目的。 (IE。只在需要时加载东西)

答案 1 :(得分:0)

我最终使用了这个:

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

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

相关问题