1

最初に Entity Framework 4.1 コードを使用しており、2 つのエンティティと、両方のエンティティが継承する 1 つの抽象クラスがあります。

public abstract class Customer
{
    public long CustomerId { get; set; }
    public string Rating { get; set; }
    public int FinancialStatusValue { get; internal set; }
}

public class Organization : Customer
{
    public string Name { get; set; }
    public string Name2 { get; set; }
    public string LegalName { get; set; }
    public string OrganizationNumber { get; set; }
    public string Vat { get; set; }
    public string Duns { get; set; }
    public Organization HeadQuarter { get; set; }
    public virtual ICollection<Organization> ChildOrganizations { get; set; }
}

私は自分のモデルを次のようにマッピングします:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

        modelBuilder.Entity<Customer>().ToTable("Customer");
        modelBuilder.Entity<Organization>().ToTable("Organization");

        modelBuilder.Entity<Organization>().HasOptional(h => h.HeadQuarter)
            .WithMany(c => c.ChildOrganizations)
            .HasForeignKey(o => o.ParentId);

 }

次に、次を使用して組織をクエリします。

var org = ctx.Customers.OfType<Organization>().Single(c => c.CustomerId == 259033);

ParentId は入力されますが、HeadQuarter と ChildOrganizations は常に null です。

私は何が欠けていますか?

4

1 に答える 1

2

次を使用して、ナビゲーション プロパティを熱心に読み込むことができますInclude

var org = ctx.Customers.OfType<Organization>()
    .Include(o => o.HeadQuarter)
    .Include(o => o.ChildOrganizations)
    .Single(c => c.CustomerId == 259033);

初めてアクセスしたときにナビゲーション プロパティを読み込む遅延読み込みを利用することもできます。ナビゲーション プロパティを として宣言する必要がありますvirtual。(これは のためだけに行いましChildOrganizationsたが、 のためではありませんHeadQuarter。)

Includeは、正確に指定したナビゲーション プロパティのみをロードすることに注意してください。ツリー構造全体をロードしません。つまり、 loadOrganization.ChildOrganizations.ChildOrganizationsなどではありません。

于 2011-10-10T14:21:50.980 に答える