Entity Framework определяет, что было включено () - PullRequest
0 голосов
/ 03 декабря 2011

При динамическом добавлении включений в запрос объекта, т. Е.

ObjectQuery<Address> oQuery = oAddressingEntitiesContext.Addresses.Include("StreetName");

if (sResultOption == "FULL")
{
    oQuery = oQuery.Include("AddressLocation").Include("AddressIdentifiers");
}

IQueryable<Address> oResult = oQuery.Where(oParser.getSearchPredicate());

Существует ли способ определить при просмотре результатов запроса в нисходящем направлении, имеет ли объект включенные связанные объекты AddressLocation & AddressIdentifiers, просмотрев адресюридическое лицо?

В идеале было бы полезно что-то вроде "IsLoaded"

foreach (Address oAddress in oResult)
{
    if (oAddress.AddressLocation.IsLoaded)
    {
       ...
    }
}

Кажется, что любые ссылки на дочерние объекты заставляют ef пытаться загрузить их из-за отложенной загрузки.(Я получаю сообщение об ошибке при доступе к связанному объекту, когда он не был включен, что уже есть открытый считыватель данных ..)

1 Ответ

1 голос
/ 04 декабря 2011

IsLoaded - это свойство, доступное в классе RelatedEnd, которое является базовым для EntityReference и EntityCollection<...>. EntityObject объекты используют эти классы для предоставления информации о свойствах навигации, а POCO - нет. В случае объектов с прокси вы обычно можете преобразовать свойство навигации по коллекции в EntityCollection<...> (вам все равно придется отключить отложенную загрузку перед этой операцией), но я не уверен, как легко получить EntityReference, кроме как копаться в ObjectStateEntry и RelationshipManager.

В любом случае, ваша самая большая проблема, вероятно, является исключением при проверке собственности. Это можно решить двумя способами: либо вы разрешаете ленивую загрузку , либо выключаете ее:

context.ContextOptions.LazyLoadingEnabled = false;

Вы можете позвонить до проверки, и отложенная загрузка не будет выполнена. После проверки вы можете снова включить отложенную загрузку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...