9

EntityFrameworkを使用するASP.NETMVC 3には、次のように、別のオブジェクトを参照するナビゲーションプロパティを持つドメインオブジェクトがあります。

public class Person
{
    public String Name {get;set;}

    public Guid CompanyID{get;set;}

    [ForeignKey(CompanyID)]
    public virtual CompanyType Company{ get; set; }
}

Personのインスタンスを作成してデータベースに追加しようとすると、DBContextはこのエンティティ「Person」のキャッシュを保持してデータベースに送信します。したがって、同じコンテキストインスタンスの存続期間の後半で、このエンティティにアクセスしようとすると、ナビゲーションプロパティが更新されないため、Companyフィールドは常にnullになります。

データベースに存在するものでナビゲーションプロパティを更新する方法はありますか?

遅延読み込みがオンになっています。

4

1 に答える 1

11

遅延読み込みがオンになっていて、遅延読み込みを使用してナビゲーションプロパティを読み込みたい場合は、次のようにPersonインスタンス化するのではなく、新しいプロキシを作成する必要があります。new

using (var context = new MyDbContext())
{
    var person = context.People.Create(); // creates a lazy loading proxy
    person.CompanyID = 123;
    context.People.Add(person);
    context.SaveChanges();

    var company = person.Company; // lazy loading query happens here
}

遅延読み込みなしで、明示的な読み込みを使用できます。

using (var context = new MyDbContext())
{
    var person = new Person();
    person.CompanyID = 123;
    context.People.Add(person);
    context.SaveChanges();

    context.Entry(person).Reference(p => p.Company).Load(); // explicit loading

    var company = person.Company; // no query anymore, Company is already loaded
}
于 2012-05-10T23:05:53.047 に答える