Nhibernate (и ORM в целом): работа с объектами или ObjectIds? - PullRequest
3 голосов
/ 29 июля 2010

Это то, что тянет меня некоторое время.Рассмотрим веб-приложение (типа MVC) с ORM (например, Nhiberate) в качестве уровня доступа к данным.

С одной стороны - рука модели OOP / Rich domain - Я чувствую, что должен обойти (ссылки) на реальные объекты, о которых я говорю.

С другой стороны - рука DB / Web App - я чувствую, что проще и эффективнее просто передавать целые идентификаторы объектов, чемсами объекты.

Рассмотрим приложение типа каталога электронной торговли:

  • Пользователь вошел в систему и перешел на страницу продукта.
  • Они оставляют комментарий.
  • Действие контроллера, которому поручено сохранение этого комментария, содержит 3 фрагмента информации: а) идентификатор пользователя (из файла cookie аутентификации или где-либо еще), б) идентификатор продукта (возможно, из строки запроса), и в)Текст комментария.
  • Теперь, что здесь лучше всего делать?Действительно ли стоит надувать объекты пользователя и продукта (например, получая их из репозитория, со всей работой с БД, которая влечет за собой), когда мы знаем, что все, что они будут использоваться, - это чтобы ORM мог прочитать их идентификаторы и установить соответствующие внешниеключи в таблице БД, в которой хранятся комментарии?

Что люди думают об этом?Возможно, веб-приложениям следует уделять немного больше внимания, чем другим приложениям из-за их состояния без состояния?Я предполагаю, что будут ответы «все зависит», но, возможно, некоторые люди являются пуристами по этому вопросу.

Это общий вопрос, который, вероятно, применим ко многим платформам, но , если приводить примерыЯ бы предпочел, чтобы они были ASP.NET MVC, если это возможно .

Спасибо.

1 Ответ

3 голосов
/ 29 июля 2010

NHibernate имеет операцию загрузки (в отличие от выполнения get) именно по этой причине.

session.Save(
  new Comment
      {
         Text = commentTextFromScreen,
         User = session.Load<User>(userID),
         Product = session.Load<Product>(productID)
      }
};

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

Для получения дополнительной информации ознакомьтесь с публикацией в блоге Ayende: Разница между Get, Load и запросом по id.

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