Entity framework 使用实体框架4.0和代码优先和POCO:如何获取父对象及其所有子对象?

Entity framework 使用实体框架4.0和代码优先和POCO:如何获取父对象及其所有子对象?,entity-framework,poco,one-to-many,code-first,Entity Framework,Poco,One To Many,Code First,我是EF4.0新手,所以这可能是一个简单的问题。我有VS2010 RC和最新的EF CTP。我试图在EF团队的设计博客上实现“外键”代码的第一个示例 但这段代码只检索客户对象;他们的采购订单列表总是空的 using (var context = _builder.Create(_conn)) { var customers = context.Customers.ToList(); } 我还需要对ContextBuilder做什么才能使MyContext始终检索每

我是EF4.0新手,所以这可能是一个简单的问题。我有VS2010 RC和最新的EF CTP。我试图在EF团队的设计博客上实现“外键”代码的第一个示例

但这段代码只检索客户对象;他们的采购订单列表总是空的

   using (var context = _builder.Create(_conn))
   {
      var customers = context.Customers.ToList();
   }

我还需要对ContextBuilder做什么才能使MyContext始终检索每个客户的所有采购订单?

正如我所怀疑的那样,解决方案很简单。我为每个客户调用了context.LoadProperty()方法:

using (var context = _builder.Create(_conn))
{
    var customers = context.Customers.ToList();
    foreach (var customer in customers)
    {
        context.LoadProperty<Customer>(customer, c => c.PurchaseOrders);
    }
    return customers;
}
使用(var context=\u builder.Create(\u conn))
{
var customers=context.customers.ToList();
foreach(客户中的var客户)
{
LoadProperty(customer,c=>c.PurchaseOrders);
}
返回客户;
}
您还可以使用:

var customers = context.Customers.Include("PurchaseOrders").ToList();
或在ContextOptions中启用LazyLoading:

context.ContextOptions.LazyLoadingEnabled = true;

如果要序列化对象,请小心延迟加载,否则最终可能会查询整个数据库。

我会小心这种方法,因为您要对数据库进行n次往返,每个客户一次。若你们在客户的网站上有几个孩子的收藏呢?更好的方法是使用Include(见下文),它将在对数据库的单个查询中检索所有内容。
using (var context = _builder.Create(_conn))
{
    var customers = context.Customers.ToList();
    foreach (var customer in customers)
    {
        context.LoadProperty<Customer>(customer, c => c.PurchaseOrders);
    }
    return customers;
}
var customers = context.Customers.Include("PurchaseOrders").ToList();
context.ContextOptions.LazyLoadingEnabled = true;