我是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?
答案 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示例...非常感谢任何帮助!