NHibernate / ORM - дочернее обновление через веб-сервис - PullRequest
0 голосов
/ 10 мая 2010

Как правильно ОБНОВИТЬ дочерний объект с помощью NHibernate, но не нужно «пробуждать» родительский объект. Допустим, вы хотели бы попытаться избежать этого, потому что родительский объект большой или дорогой для инициации.

Предположим, что классы называются Автор (родитель) и Книга (ребенок). (тем не менее, пытаясь избежать создания автора)

Книга возвращается через веб-сервис в виде XML. Он десериализуется обратно в объект CLR. Книга имеет свойство AuthorId, которое позволяет этому происходить. Но он также имеет свойство Author.

Проблема возникает, когда вы пытаетесь SaveOrUpdate () Book, и author_id в базе данных стирается, потому что Author был нулевым, когда объект десериализовался. Похоже, это будет распространенной проблемой. Какой обходной путь?

Также, , если вы создаете экземпляр Author и у него есть свойство Books. Книга, которую вы пытаетесь обновить, уже является одной из этих книг (Список ). Мы также столкнулись с «другой объект с тем же значением идентификатора уже был связан с сеансом» проблемы. Каков стандартный процесс обновления ребенка через веб-сервис?

1 Ответ

1 голос
/ 10 мая 2010

Во-первых, ваш постоянный объект Book должен только иметь ссылку Author, а не AuthorId. Вы должны использовать DTO для своей услуги, которая содержит AuthorId, а не Author.

После этого код прост:

using (var tx = session.BeginTransaction())
{
  var book = session.Get<Book>(bookDTO.Id);
  MapAllSimplePropertiesFromDTO(bookDTO, book);
  book.Author = session.Load<Author>(bookDTO.AuthorId);
  tx.Commit();
}

session.Load<Author> создает прокси-ссылку на Author по идентификатору без перехода в базу данных.

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