2012-04-26 8 views
2

У нас есть проект с использованием Entity Framework 4.1 Code First для хранения данных. Он был закодирован таким образом, что EF абстрагируется за шаблоном репозитория. Когда объекты извлекаются из репозитория, набору данных передается огромный список включенных строк, сообщающих все связанные с ним объекты, которые также должны быть извлечены. Это приводит к безумно огромному запросу, который может занять 10 секунд, даже если в базе данных нет данных!Lazy загрузка связанных объектов, не работающих с Entity Framework 4.1

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

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

У меня есть класс с именем Пожертвование с навигационным свойством, как это:

public virtual Employee Donor { get; private set; } 

Оба класса донорства и служащим иметь частный конструктор без параметров. При использовании строки включения «Донор» я могу получить список пожертвований, и они возвращаются с прикрепленным Донором.

Когда я получаю Пожертвование из репозитория без строки include, Донор обычно возвращается как null. Если со случайным образом я зарегистрирован как сотрудник, о котором идет речь, другой запрос в другом месте системы уже выведет мой объект Employee из репозитория Employee. Когда это произойдет, пожертвование возвращается с правильным набором сотрудников! Настолько ясно, что данные «ленивы загружены», если они уже доступны из более раннего запроса. Но в целом я не буду уже спрашивать о Доноре и всех других сущностях.

Может ли кто-нибудь предложить, что я могу делать неправильно? Извините за длинный вопрос. Я могу опубликовать больше бит кода, если это необходимо, но это довольно разрозненно. Заранее спасибо!

ответ

4

Я считаю, что если вы будете следовать рекомендациям на этой странице, http://msdn.microsoft.com/en-us/library/dd468057.aspx, вы должны получить результат, который вам нужен. Специально создайте защищенный конструктор без параметров, и это должно помочь.

Но, пожалуйста, посмотрите на остальную часть руководства.

+0

Ох. Мои. Бог. Я почему-то не нашел страницу с рекомендациями, с которой вы связались. Я не знаю, откуда взялась эта идея использования частного конструктора без параметров ... но имеет смысл, что для этого потребуется защищенный конструктор. Он работает сейчас! Спасибо! – DaveBeta

Смежные вопросы