1

DB に Person と Occupation テーブルがあります。Person を作成すると、デフォルトの OccupationId は null です。

私が人物を作成し、その 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
}

最初の職業がnullの場合、保存後に新しい職業を遅延ロードする方法はありますか?

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 に答える