我正在使用EF4.1,并试图了解正确加载的正确方法。我有一个带有供应商(祖父母),购买订单(父母)和PO2Item(子)表的订单输入系统。模型看起来像这样我想从PO2Item记录开始并加载供应商。我以为我可以这样使用.include():var po = (from item in context.PO2Item.Include("PurchaseOrder.Vendor").AsNoTracking() where item.OrderLineItemId == lineItem.CostSourceLineItemId select item.PurchaseOrder).FirstOrDefault();这确实加载了PurchaseOrder记录,但po.Vendor为空。我正在阅读Julia Lerman的书,第4章指出我可以使用Load,但我认为4.1必须从4.0更改了它,因为Load似乎没有定义,并且没有诸如VendorReference之类的东西。最终,我进入了ObjectContext并能够做到这一点: if (po!=null) { context.GetObjectContext().LoadProperty(po, "Vendor"); }确实加载了供应商,但我感觉我缺少一些简单得多的东西。为什么Include(“ PurchaseOrder.Vendor”)不起作用?根据Craig的答案进行更新。与其将结果转换为ObjectQuery (本身就是一个很酷的小技巧),我只是分两个阶段编写了查询var links = from link in context.PO2Item.Include("PurchaseOrder.Vendor").AsNoTracking() where link.OrderLineItemId == lineItem.CostSourceLineItemId select link;var po_2_item = links.FirstOrDefault();return po_2_item == null ? null : po_2_item.PurchaseOrder;现在,返回的采购订单(如果存在)已正确设置了供应商。有关更优雅的解决方案,请参见this answer。 最佳答案 .Include()用于返回查询的形状。您的查询返回一个PurchaseOrder,而不是一个PO2Item。您需要更多类似的东西(猜测此处的类型-您可能正在使用DbSet-相应地进行调整):var po = ((ObjectQuery<PurchaseOrder>) (from item in context.PO2Item where item.OrderLineItemId == lineItem.CostSourceLineItemId select item.PurchaseOrder)) .Include("Vendor") .AsNoTracking() .FirstOrDefault();关于c# - 我如何渴望在EF 4.1中加载祖 parent 记录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8174961/ 10-10 20:12