2012-07-23 26 views
3

我一直在这篇文章下面,http://blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part-6-loading-related-entities.aspx实体框架 - 故障与.Load()

具体标题为“应用过滤器加载明确相关实体的时候”。

我需要做的是这样的:当我通过这一步

db.Configuration.LazyLoadingEnabled = false; 
var class = db.Classes.Find(1); 
db.Entry(class).Collection(c => c.Students).Query().Where(s => s.grade > 2.0).Load(); 

,看SQL事件探查我看到加载类的查询。然后我看到应该加载学生,但类的查询。学生从未填充,并保持空。但是,如果我从SQL分析器中复制学生查询并在自己中运行,则会返回相应的学生。看来,实体框架正在运行学生查询并获得正确的结果,但没有将它们附加到类对象。

有办法我可以解决这个问题,但我想知道如果我错过了一个步骤,或者如果我没有正确使用.Load()。

回答

2

如果ClassStudent之间的关系是一个许多一对多关系,你看到的是预期的行为(尽管混乱,我承认)。首先,如果你看过智能感知说怎么样Load方法...

枚举查询,使得服务器的查询,如那些 System.Data.Entity.DbSet, System.Data.Objects的.ObjectSet, System.Data.Objects.ObjectQuery等 查询的结果将被加载到关联的System.Data.Entity.DbContext, System.Data.Objects.ObjectContext或客户端上的其他缓存 。这个 相当于调用ToList,然后扔掉列表 ,而没有实际创建列表的开销。

...它没有说,实体的导航集运行与被填充的查询,只有结果被加载到上下文。

当您调用Load是不是真的这个方法,但所谓关系跨度或修复行动方面的后续处理结果中的一个一对多关系情况下,导航集合填充,这种处理不会发生在多对多的关系中。

在这个问题的答案是更多的细节:EF 4.1 loading filtered child collections not working for many-to-many

的精髓在于 - 对于许多一对多的关系 - 你必须直接使用ToList()代替Load()填充导航集合:

var class1 = db.Classes.Find(1); 
class1.Students = db.Entry(class1).Collection(c => c.Students).Query() 
    .Where(s => s.grade > 2.0).ToList(); 

这会将学生加载到上下文中同时在class1中填充导航集合。