其他分享
首页 > 其他分享> > 渴望在EF 4.1中加载祖父母记录

渴望在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