Промывка в NHibernate - PullRequest
       2

Промывка в NHibernate

1 голос
/ 18 сентября 2009

Этот вопрос немного глупый, но я до сих пор не понимаю, как лучше справиться с промывкой.

Я мигрирую существующую кодовую базу, которая содержит много кода, подобного следующему:

private void btnSave_Click()
{
     SaveForm();
     ReloadList();
}

private void SaveForm()
{
    var foo = FooRepository.Get(_editingFooId);

    foo.Name = txtName.Text;

    FooRepository.Save(foo);
}

private void ReloadList()
{
     fooRepeater.DataSource = FooRepository.LoadAll();
     fooRepeater.DataBind();
}

Теперь, когда я меняю FooRepository на Nhibernate, что я должен использовать для метода FooRepository.Save? Должен ли FooRepository всегда сбрасывать сеанс при сохранении сущности?

Ответы [ 3 ]

3 голосов
/ 18 сентября 2009

Я не уверен, что понимаю ваш вопрос, но вот что я думаю:

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

Рассмотрим следующие сценарии:

Изменение данных:

  • Получить данные из базы данных по любому запросу. Объекты сейчас находятся в сеансе NH
  • Изменить сущности, просто изменив значения свойств
  • Передать транзакцию. Изменения сбрасываются и сохраняются в базе данных.

Создать новый объект:

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

Если вы работаете с отсоединенными сущностями, вам также понадобится Update или SaveOrUpdate для помещения отсоединенных сущностей в сеанс.

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

1 голос
/ 19 сентября 2009

Я бы проголосовал за ответ Стефана Мозера, если бы мог - я все еще сталкиваюсь с Nh, но я думаю, что было бы здорово написать такой код:

private void SaveForm()
{
    using (var unitofwork = UnitOfWork.Start())
    {
        var foo = FooRepository.Get(_editingFooId);
        var bar = BarRepository.Get(_barId);

        foo.Name = txtName.Text;
        bar.SomeOtherProperty = txtBlah.Text;

        FooRepository.Save(foo);
        BarRepository.Save(bar);

        UnitOfWork.CommitChanges();
    }
}

таким образом, либо все действие завершается успешно, либо происходит сбой и выполняется откат, сохраняя управление очисткой / транзакциями за пределами хранилищ.

1 голос
/ 18 сентября 2009

Неважно, явно ли вы очищаете сеанс между изменением сущности Foo и загрузкой всех Foos из хранилища. NHibernate достаточно умен, чтобы автоматически очищать себя, если вы внесли изменения в сеанс, которые могут повлиять на результаты запроса, который вы пытаетесь выполнить.

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

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