使用Entity Framework 4.0与Code-First和POCO:如何获取其所有子项的父对象?

时间:2010-03-02 02:16:05

标签: entity-framework poco one-to-many code-first

我是EF 4.0的新手,所以这可能是一个简单的问题。我有VS2010 RC和最新的EF CTP。我正在尝试在EF团队的设计博客http://blogs.msdn.com/efdesign/archive/2009/10/12/code-only-further-enhancements.aspx上实现“外键”代码优先示例。

public class Customer
{
   public int Id { get; set; 
   public string CustomerDescription { get; set; 
   public IList<PurchaseOrder> PurchaseOrders { get; set; }
}

public class PurchaseOrder
{
   public int Id { get; set; }
   public int CustomerId { get; set; }
   public Customer Customer { get; set; }
   public DateTime DateReceived { get; set; }
}

public class MyContext : ObjectContext
{
   public RepositoryContext(EntityConnection connection) : base(connection){}
   public IObjectSet<Customer> Customers { get {return base.CreateObjectSet<Customer>();} }
}

我使用ContextBuilder配置MyContext:

{
   var builder = new ContextBuilder<MyContext>();

   var customerConfig = _builder.Entity<Customer>();
   customerConfig.Property(c => c.Id).IsIdentity();

   var poConfig = _builder.Entity<PurchaseOrder>();
   poConfig.Property(po => po.Id).IsIdentity();

   poConfig.Relationship(po => po.Customer)
      .FromProperty(c => c.PurchaseOrders)
      .HasConstraint((po, c) => po.CustomerId == c.Id);

   ...
}

这在我添加新客户时正常工作,但在我尝试检索现有客户时却无法正常工作。此代码成功保存了新客户及其所有子PurchaseOrders:

using (var context = builder.Create(connection))
{
   context.Customers.AddObject(customer);
   context.SaveChanges();
}

但是这段代码只检索Customer对象;他们的PurchaseOrders列表总是空的。

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

我还需要对ContextBuilder做些什么才能让MyContext始终检索每个客户的所有PurchaseOrders?

3 个答案:

答案 0 :(得分:3)

你也可以使用:

var customers = context.Customers.Include("PurchaseOrders").ToList();

或在ContextOptions中启用LazyLoading:

context.ContextOptions.LazyLoadingEnabled = true;

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

答案 1 :(得分:2)

嗯,解决方案结果很简单,因为我怀疑它可能。我为每个客户调用了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;
}

答案 2 :(得分:1)

我正在使用已发布的4.0 / VS 2010 / EF版本,我似乎无法找到存储ContextBuilder的命名空间。在CTP示例中,我看到它位于'Microsoft.Data.Objects'中,但我似乎无法找到该引用。我在创建Model-First示例时没有遇到任何问题,但我仍然坚持使用我正在使用的Code-First示例...非常感谢任何帮助!

相关问题