Я использую EF4.1 и пытаюсь понять правильный подход к загрузке.
У меня есть система ввода заказов с таблицей Vendor (grandparent), Order Buy (parent) и PO2Item (child). Модель выглядит так
Я хочу начать с записи 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 имеет значение null. Я читал книгу Джулии Лерман, и в Главе 4 указывалось, что я могу использовать Load, но я думаю, что 4.1, должно быть, изменил это с 4.0, потому что Load, кажется, не определена, и нет такой вещи как VendorReference. В конце концов я копался в ObjectContext и смог сделать это:
if (po!=null)
{
context.GetObjectContext().LoadProperty(po, "Vendor");
}
, который загружает Продавца, но у меня такое чувство, что я упускаю что-то гораздо более простое. Почему не работает Include ("PurchaseOrder.Vendor")
ОБНОВЛЕНИЕ, основанное на ответе Крейга.
Вместо того, чтобы приводить результат как 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;
Для возвращенного заказа на поставку (если он существует) поставщик установлен правильно.
См. этот ответ для более элегантного решения.