2013-02-08 45 views
1

这里是我的工作类的简化版本:试图让计算性能发挥好与实体框架

public class Parent 
{ 
    public int Id { get; set; } 
    public List<Child> Children { get; set; } 
    public int ChildrenSum { get { return Children.Sum(c => c.Value); } } 
} 

public class Child 
{ 
    public int Id { get; set; } 
    public int Value { get; set; } 
    public Parent Parent { get; set; } 
} 

public class TestDbContext : DbContext 
{ 
    public DbSet<Parent> Parents { get; set; } 
    public DbSet<Child> Children { get; set; } 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Child>().HasRequired(e => e.Parent); 
     modelBuilder.Entity<Parent>().HasMany(e => e.Children); 
    } 
} 

public class TestDbContextInitializer : DropCreateDatabaseAlways<TestDbContext> 
{ 
    protected override void Seed(TestDbContext context) 
    { 
     var parent = new Parent { Children = new List<Child>() }; 
     parent.Children.Add(new Child { Value = 3 }); 
     parent.Children.Add(new Child { Value = 1 }); 
     parent.Children.Add(new Child { Value = 2 }); 
     context.Parents.Add(parent); 
    } 
} 

当我得到的一切运行时,所有的种子信息在数据库中,但ChildrenSum属性失败,因为孩子没有被加载。这是我的期望,因为我没有使导航属性变为虚拟。我错过了什么吗?

回答

4

当您制作导航属性virtual时,您启用延迟加载。你有这个权利。但在这种情况下,延迟加载的相反情况并不急于加载。它是“没有加载,除非做加载”。

因此,您必须启用延迟加载或使用Include。或做类似

db.Entry(parent).Collection(p => p.Children).Load(); 

其中dbTestDbContext实例和parent已取得的Parent对象。

+0

感谢您的提示! – edsobo 2013-02-11 14:31:59