渴望在EF 4.1中加载祖父母记录
作者:互联网
我正在使用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();
标签:entity-framework-4-1,linq,c 来源: https://codeday.me/bug/20191202/2085726.html