Самореферентные отношения в Entity Framework - PullRequest
1 голос
/ 10 октября 2011

Сначала я использую код Entity Framework 4.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 всегда равны нулю.

Чего мне не хватает?

1 Ответ

2 голосов
/ 10 октября 2011

Вы можете загрузить свойства навигации, используя Include:

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

Вы также можете использовать отложенную загрузку, которая будет загружать свойства навигации при первом обращении к ней. Вы должны объявить свои свойства навигации как virtual. (Вы сделали это только для ChildOrganizations, но не для HeadQuarter.)

Имейте в виду, что Include будет загружать только те свойства навигации, которые вы точно указали. Он не будет загружать всю вашу древовидную структуру, т.е. не загружать Organization.ChildOrganizations.ChildOrganizations и т. Д.

...