Как это можно сделать с помощью (N) Hibernate? - PullRequest
2 голосов
/ 15 марта 2010

Я создаю приложение Windows Forms с помощью NHibernate. Это приложение MDI, поэтому нет ограничений на количество форм, которые пользователь может открыть одновременно (вероятно, много).

Для большинства форм я хочу иметь кнопки «ОК» и «Отмена». Оба закрывают форму, но «ОК» также сохраняет измененные данные в БД. Формы могут быть довольно сложными, и изменения, вероятно, затронут целый граф объектов, добавляя некоторые, удаляя некоторые и изменяя некоторые другие. Было бы хорошо, если бы изменения могли автоматически обнаруживаться и сохраняться по мере необходимости, без необходимости вручную отслеживать каждый из них.

Что было бы хорошим способом сделать это?

Дополнительная информация : Я могу создать любую схему БД, какую захочу. Я использую MSSQL 2008 и в настоящее время определил первичные ключи GUID (с генератором guid.comb) и столбец TIMESTAMP для оптимистичного параллелизма.

Я попытался просто установить FlushMode NHibernate ISession на Never, выполнив все необходимые изменения и затем вызвав Flush(), если пользователь нажал OK. Но это не сработало.

Ответы [ 3 ]

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

Несколько возможных решений, при условии, что вы используете один ISession на экземпляр формы:

  1. Вызовите ISession.Clear, если пользователь отменяет.
  2. Установите для FlushMode значение Commit и инициируйте транзакцию только тогда, когда пользователь нажимает кнопку OK.
  3. Придерживайтесь оригинального подхода использования Manual FlushMode. Это должно работать, и поведение, которое вы видите, не является ошибкой.

Поскольку вы используете GUID для первичных ключей, вам не следует сталкиваться с проблемой неожиданного сброса NH сеанса, поскольку ему требуется база данных для генерации идентификатора. Вам все еще нужно знать о сценариях, в которых NH может сбрасываться перед выбором, чтобы обеспечить согласованные результаты.

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

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

Это должно помочь: Советы и рекомендации NHibernate с ASP.NET, 1.2-е издание. (я знаю, что это ASP.NET, но вы должны найти информацию полезной и легко переносимой в WinForms.)

Короче говоря, нужно выбрать sesson для каждой архитектуры окна. Делать невозможным открытие двух разных окон для одной и той же задачи имеет смысл здесь. Затем, возможно, вы захотите создать экземпляр API-интерфейса NHibernate в Form_Load (). В конце, если пользователь нажимает OK, то просто BeginTransaction (), Flush () сеанс и Commit () транзакция, в противном случае откат ее.

0 голосов
/ 15 марта 2010

Может быть, если вы заключите все это в транзакцию и подтвердите транзакцию, когда пользователь нажмет OK?

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