Как я могу остановить автоматически сгенерированный класс Linq to SQL от загрузки ВСЕХ данных? - PullRequest
0 голосов
/ 12 марта 2010

ОБНОВЛЕНИЕ : из того, что я слышу, я представлял проблему, которую описал ниже. Итак, это в значительной степени не вопрос. Будущие читатели, двигайтесь дальше ... здесь нечего видеть.


У меня есть проект ASP.NET MVC, очень похожий на учебный пример NerdDinner . (Я использую MVC 2, но для его создания следовал учебному пособию по NerdDinner).

В соответствии с инструкциями часть 3 данного учебного пособия я создал модель моей базы данных Linq-to-SQL, создав поверхность "Linq to SQL Classes" (.dbml), и сбросив мои таблицы базы данных на него. Дизайнер автоматически добавил связи между сгенерированными классами на основе таблиц моей базы данных.

Допустим, мои классы соответствуют примеру NerdDinner, поэтому у меня есть таблицы Dinner и RSVP, где каждая запись Dinner связана со многими записями RSVP - следовательно, в сгенерированных классах объект Dinner имеет свойство RSVPs, которое является список объектов RSVP.

Моя проблема заключается в следующем : оно появляется (и я с радостью ошибаюсь), что как только я получить доступ к объекту Dinner, он загружает все соответствующие объекты RSVP, даже если я не использую член RSVP.

Первый вопрос : действительно ли это поведение по умолчанию для сгенерированных классов?

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

Второй вопрос : есть ли какие-либо свойства, предоставляемые через интерфейс дизайнера, которые позволили бы мне изменить это поведение? (Я не могу найти ни одного).

Третий вопрос : я видел описание того, как управлять загрузкой связанных записей в DataContext с помощью объекта DataShape, связанного с DataContext. Это то, что я собираюсь сделать, и если да, то есть ли какие-нибудь учебные пособия, такие как NerdDinner, которые не только показывают, как это сделать, но и предлагают «шаблон» для обычного использования?

Ответы [ 2 ]

1 голос
/ 12 марта 2010

Если у вас есть отношение 1: M, генератор кода L2S сгенерирует класс сущности для единственного объекта и включит в него набор дочерних объектов. Когда вы извлекаете единственную (родительскую) сущность, L2S не будет извлекать дочерние объекты, пока вы не попытаетесь каким-либо образом получить доступ к коллекции дочерних объектов. Это называется Ленивая Загрузка. Мне известно, что нет способа помешать L2S извлекать дочерние объекты, кроме как никогда не пытаться получить доступ к коллекции дочерних объектов. Но учтите, что если вы никогда не получите доступ к дочерней коллекции, L2S НЕ БУДЕТ получать дочерние строки. Итак, поскольку ваше приложение извлекает дочерние строки, вы должны каким-то образом получать доступ к коллекции.

Вы также можете выполнить так называемую «активную загрузку», если L2S автоматически получит дочерние объекты, прежде чем пытаться получить доступ к коллекции. Тем не менее, это не похоже на то, что вы хотите сделать.

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