如何在不使用EntityReference.Load()的情况下手动加载EntityReference

时间:2009-06-13 13:43:07

标签: .net entity-framework ado.net

我有实体类型Order,它引用了一个实体类型Customer。 有一个函数导入,它根据条件返回Order列表。这个订单列表显示在Datagrid中,显示

Order.Date | Order.Customer.Name | Order.Total

要显示Customer.Name,我需要在列表中的每个Order中加载CustomerReference,但每次调用Order.CustomerReference.Load()都会进行SQL Server往返并使整个过程效率非常低。问题是,如果我有一个查询检索列表中所有订单的所有客户数据,如何在每个订单中手动填充CustomerReference?

基本上我需要使用函数import .Include(“Customer”)。

由于

2 个答案:

答案 0 :(得分:2)

如果您执行一次性回收所有相关客户的查询,则无需手动填充每个CustomerReference。这是因为一个名为Relationship Fixup的东西会自动为你做这件事。

即。如果你这样做:

Order o = ctx.Orders.First(o => o.Customer.ID == 1);
// at this point o.Customer == null

Customer c = ctx.Customers.First(c => c.ID == 1);
// at this point o.Customer == c

关系修复意味着在客户输入上下文后,所有相关对象现在将自动指向它...

即。这比你想象的容易得多!

希望这有帮助

亚历

答案 1 :(得分:-1)

谢谢Alex,我试过了。它按照你的说法工作,但显然它不适用于派生实体类型。 Order Entity Type是一个抽象基类,它有一个派生类Sale。

Order o1 = ctx.Orders.First(o => o.Customer.ID == 1); 
Sale s1 = ctx.GetSaleByCustomerID_FunctionImport(2).First(); 

Customer c = ctx.Customers.First(c => c.ID == 1); 
Customer c2 = ctx.Customers.First(c => c.ID == 2);
//At this point o.Customer == c but s1.Customer is still null 

我不能将函数import return类型设置为Order,因为它是抽象的,不允许作为返回类型。

我在这里缺少什么?

更新: 在客户加载之前我发现o1和s1之间存在差异 o1.CustomerReference.IsLoaded是假的 o1.CustomerReference.EntityKey是ID = 2

s1.CustomerReference.IsLoaded为False s1.CustomerReference.EntityKey为null

但是调用s1.CustomerReference.Load()会正确加载Customer数据。 我仔细检查了我的GetSaleByCustomerID函数导入(只是“SELECT * FROM Customers WHERE ID = 2”),它确实返回了引用所需的CustomerID字段。