Как я могу принудительно выполнить полную загрузку вдоль отношений навигации в Entity Framework? - PullRequest
2 голосов
/ 05 октября 2008

Хорошо, я делаю первый опыт использования ADO.NET Entity Framework.

Мой тестовый пример сейчас включает базу данных SQL Server 2008 с 2 таблицами, Member и Profile, с соотношением 1: 1.

Затем я использовал мастер Entity Data Model для автоматической генерации EDM из базы данных. Он сгенерировал модель с правильной ассоциацией. Теперь я хочу сделать это:

ObjectQuery<Member> members = entities.Member;
IQueryable<Member> membersQuery = from m in members select m;
foreach (Member m in membersQuery)
{
   Profile p = m.Profile;
   ...
}

Который работает на полпути. Я могу перебрать всех членов. Но проблема у меня в том, что m.Profile всегда нулевой. Примеры LINQ to Entities в библиотеке MSDN, по-видимому, позволяют предположить, что я смогу беспрепятственно следовать навигационным отношениям, но это, похоже, не работает таким образом. Я обнаружил, что если я сначала каким-либо образом загружу профили в отдельном вызове, например, с использованием entity.Profile.ToList, то m.Profile будет указывать на действительный профиль.

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

Спасибо

Ответы [ 3 ]

6 голосов
/ 06 октября 2008

Хорошо, мне удалось найти нужный мне ответ здесь http://msdn.microsoft.com/en-us/magazine/cc507640.aspx. Следующий запрос убедится, что сущность профиля загружена:

IQueryable<Member> membersQuery = from m in members.Include("Profile") select m;
1 голос
/ 01 декабря 2008

Проведя немного больше исследований, нашёл это ... Ссылка на StackOverflow , в которой есть сообщение на Функциональная ссылка , что намного лучше, чем моя попытка расширения: -)

1 голос
/ 30 ноября 2008

Я использовал эту технику в отношениях 1 ко многим и хорошо работает. У меня есть класс Survey и много вопросов в рамках этого из другой таблицы БД, и с помощью этой техники удалось извлечь связанные вопросы ...

context.Survey.Include("SurveyQuestion").Where(x => x.Id == id).First()

(контекст является сгенерированным ObjectContext).

context.Survey.Include<T>().Where(x => x.Id == id).First()

Я просто потратил 10 минут, пытаясь собрать метод расширения, чтобы сделать это, самый близкий, который я мог придумать, это ...

    public static ObjectQuery<T> Include<T,U>(this ObjectQuery<T> context)
    {
        string path = typeof(U).ToString();
        string[] split = path.Split('.');

        return context.Include(split[split.Length - 1]);
    }

Любые указатели для улучшений будут приветствоваться: -)

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