ORM - Создать объект с ассоциациями - PullRequest
2 голосов
/ 26 октября 2009

Один объект связан со многими другими:

Пример: один Post является частью одного Blog, имеет список отношений с Tags и многое другое .....

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

Теперь, когда я пытаюсь создать этот новый Post, мне нужно сделать что-то вроде этого:

Post post = new Post();
post.Blog = blog;
.....

До ORM Я мог использовать SQL-запросы для создания объекта и передавать только Id блога, , но теперь Мне нужно передать объект блога. Это означает, что мне нужно будет извлечь его из БД только для того, чтобы создать пост, и этому посту также понадобятся теги объектов и другие вещи. Я думаю, что это ненужная операция. Зачем мне нужно, чтобы все другие объекты создавали что-то еще?

Здесь есть аналогичный вопрос здесь , но без принятого ответа.

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

Я бы хотел создать это post, пропуская только Id из blog. Есть ли способ сделать это?

.

Примечание : использование NHibernate, но я думаю, что это общий вопрос ORM.

Ответы [ 4 ]

1 голос
/ 20 июля 2010

Вы можете использовать проекционные классы. Получение только необходимой информации, а не полной записи в БД.

Один пример:

HqlBasedQuery query = new HqlBasedQuery(typeof(Post),
        @"
        SELECT tags.Id, tags.Name
        FROM Post post
        INNER JOIN post.Tags tags
        WHERE post.Id = ?
        ORDER BY tags.Name
        ", postId);
        var results = from object[] summary in (ArrayList)ActiveRecordMediator.ExecuteQuery(query)
                      select new YourProjectionClass
                      {
                          Id = (int)summary[0],
                          Name= (string)summary[1],
                      };
        return results.ToList<YourProjectionClass>();
0 голосов
/ 26 октября 2009

Справа: если ORM поддерживает отложенную выборку (hibernate делает), sess.load (class, id) фактически не генерирует SQL-запрос, а возвращает неинициализированный прокси.

0 голосов
/ 26 октября 2009

Для Hibernate (не NHibernate, но он должен быть похожим) Я считаю, что вы обычно можете использовать HQL-запросы для загрузки объектов следующим образом:

select id from Blog where ...

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

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

В любом случае, только потому, что у вас есть среда ORM, выполняющая преобразование за вас, не означает, что вы освобождаетесь от всех мелких деталей о том, как загружать объекты. На самом деле, получить правильный уровень доступа к данным - одна из самых сложных задач. Особенно при работе с устаревшей базой данных, которая не совсем соответствует Hibernate, придерживайтесь простых принципов.

0 голосов
/ 26 октября 2009

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

Это очень обычный код:

    Post post = new Post();
    post.setBlog(new Blog(123));

Если используется много раз, есть очевидный способ уменьшить этот код. Я оставляю это тебе как упражнение; -)


Обратите внимание, что это вызывает другие проблемы. Например, когда вы имеете дело с блогом, он полностью инициализируется?

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