我首先使用的是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始终为空。
我错过了什么?
答案 0 :(得分: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
只会加载您准确指定的导航属性。它不会加载整个树结构,即不加载Organization.ChildOrganizations.ChildOrganizations
等等。