NHibernate: лучший момент для хранения изменений в графическом интерфейсе - PullRequest
1 голос
/ 16 января 2010

Я немного запутался с NHibernate и Session. Как я понял, я должен использовать сеансы «как можно быстрее», что означает, что два разных взаимодействия получают свой собственный сеанс.

Что мне делать в случае взаимодействия с пользовательским интерфейсом, я хочу сохранить в БД. У меня есть простой пример, где древовидная структура перечисляет некоторые элементы и привязана к свойству IsExpanded моих бизнес-объектов (я знаю, что это плохая практика, но для моего подхода это нормально) ...

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

Есть ли какие-то шаблоны или советы для такого рода проблем. Вид "уберите и храните информацию GUI в нужный момент" ...

Вот код для лучшего понимания:

    private static PjmDbController _d;
    private static IList<Topic> _allItems;

    private static void TopicStoresChildStatesExpandedOrNot()
    {
        var w = new Window();
        _d = new PjmDbController();
        _allItems = _d.GetAllRoots();
        w.Content = new PjmTreeView<Topic>() {ItemsSource = _allItems};
        w.Show();
        w.Closed += new EventHandler(w_Closed);
    }

    static void w_Closed(object sender, EventArgs e)
    {
        _d.Session.Flush();
    }

Спасибо за советы, Chris

PS: Статика только для тестирования: -)

Ответы [ 2 ]

2 голосов
/ 16 января 2010

Это все должно быть связано с тем, когда пользователь обычно выбирает операцию сохранения (т. Е. С помощью кнопки «Сохранить изменения» или подтверждения сохранения при выходе из формы).

(В качестве дополнения) в тех случаях, когда вы хотите, чтобы живое сохранение происходило без вмешательства пользователя (т. Е. Сохранение состояния в игре и т. Д.), Тогда одним из шаблонов является использование основанной на времени очереди, то есть операции изменения, если последнее сохранение было более X секунд назад, сохраняйте ваши объекты - поскольку сохранение каждого отдельного изменения может быть излишним в зависимости от объема.

1 голос
/ 16 января 2010

Это полностью зависит от объема единицы работы в приложении. Лучшая практика с NHibernate - рассматривать сессию как единицу работы. Если открытие формы, управление деревом и закрытие формы представляет собой единицу работы, то имеет смысл очистить сеанс, когда форма закрыта. Однако я бы сохранил изменения внутри транзакции, а не сбрасывал сеанс. Этот ответ - хороший совет по управлению сессией.

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