Используя NHibernate, как я могу сохранить все свои репозитории в одном Save () - PullRequest
0 голосов
/ 23 марта 2011

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

Затем я создаю группу клиентов и связанных с ними учетных записей и добавляю их в соответствующие репозитории. Теперь я хочу сохранить эти репозитории в базе данных. Однако для сохранения в NHibernate необходимо вызвать ISession.Save () и передать объект. Если бы вместо этого я использовал Entity Framework, а моя ISession была ObjectContext, я мог бы вызывать ObjectContext.SaveChanges () и содержимое всех моих репозиториев будет сохранено в базе данных.

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

Что я пропустил?

Ответы [ 2 ]

2 голосов
/ 23 марта 2011

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

Так что просто позвоните Session.Flush();

1 голос
/ 23 марта 2011

Вы пропустили ту часть, где вы связываете новый объект с ISession (session.Save ()). Иначе как NH узнает, что какой-то созданный вами объект необходимо сохранить? Если вы изменяете только существующие объекты (которые вы извлекли из сеанса IS), тогда все, что вам нужно сделать, это зафиксировать транзакцию / очистить сеанс.

Для отношений клиент -> учетная запись вы можете сэкономить каскад клиентов на его счете.

...