Использование метода Include для загрузки связанных объектов в EntityFramework - PullRequest
2 голосов
/ 23 февраля 2012

Ниже приведен раздел моей модели Entity Framework.Вы заметите, что у меня есть таблица «заголовков», которая связана со многими записями «AssetHolding», которые могут быть одного из 3 типов, для которых я использую наследование (TpH). Пожалуйста, игнорируйте тот факт, что все 3 унаследованных типа выглядят одинаково - это преднамеренно

Entity model

При редактировании этих данных мне нужно получить один определенный заголовок по идентификаторуи все связанные AssetHoldings.Метод для этого выглядит следующим образом:

public AssetValuationHeader GetValuationHeaderById(int id)
{
    return this.AssetValuationHeaders
        .Include("AssetHoldings")
        .Where(vh => vh.Id == id)
        .FirstOrDefault();
}

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

Проблема, с которой я столкнулся, заключается в том, что я также необходимо загрузить бит, выделенный зеленой рамкой на изображении выше.Как вы можете видеть, это относится только к одной из 3 таблиц наследования.

Я пробовал это:

public AssetValuationHeader GetValuationHeaderById(int id)
{
    return this.AssetValuationHeaders
        .Include("AssetHoldings")
        .Include("AssetHoldings.SwapAssetHoldingNotionals")
        .Where(vh => vh.Id == id)
        .FirstOrDefault();
}

Указанный путь включения недействителен.EntityType 'CoreValuationModel.AssetHolding' не объявляет свойство навигации с именем 'SwapAssetHoldingNotionals'.

Возможно ли это даже при использовании метода Include?(т.е. без использования LazyLoading) Есть ли обходной путь, если нет?

1 Ответ

1 голос
/ 23 февраля 2012

Джей,

[spoiler] - кодируется из полной памяти и может вообще не компилироваться !!

Во всяком случае, у меня были ситуации, когда мне приходилось загружать график на несколько уровней в глубину и, кажется, не забывал делать что-то вроде следующего:

public AssetValuationHeader GetValuationHeaderById(int id)
{
    return this.AssetValuationHeaders
        .Include("AssetHoldings")
        .Include("AssetHoldings").Select(sa => sa.SwapAssetHoldingNotionals)
        .Where(vh => vh.Id == id)
        .FirstOrDefault();
}

или

public AssetValuationHeader GetValuationHeaderById(int id)
{
    return this.AssetValuationHeaders
        .Include("AssetHoldings")
        .Include("AssetHoldings").Include("SwapAssetHoldingNotionals")
        .Where(vh => vh.Id == id)
        .FirstOrDefault();
}

как я уже сказал, не стреляйте в мессенджера (позже проверим это на моем «телефоне»)

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