Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> точки сохранения в NHibernate, как лучше сделалать? 
:(
    Опции темы
MFSham
Дата 4.12.2007, 19:20 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 28.8.2005
Где: Беларусь, Гродно

Репутация: нет
Всего: 3



Изучаю NHibernate. Решил вот переделать(а заодно и попробовать в действии NHibernate) свой проект, который работал на Typed DataSet. (БД - MSSQL 2005)

Использую DataSet в моем приложении пользователь мог внести ряд изменений в БД, открыв при том соответствующее окно редактирования. При его закрытии спрашивалось, сохранять ли изменения в БД. Соответственно если хотел - AcceptChanges, иначе откат. Т.к. база была отсоединена, соответственно все изменения производились в DataSet'e, то и все было хорошо.

В Hibernate'e же все изменения заносятся сразу в БД. Конечно можно при открытии формы запустить одну единственную сессию с транзакцией, которая будет висеть открытой на протяжении всей работы с формой, и при закрытии и отказе сохранения делать RollBack. Но считаю это не эффективным и геморойным решением. Может можно как-то установить точку сохранения на которую можно будет откатить БД? Или еще чего?
--------------------
Без ветра трава неподвижна. Без программ компьютеры бесполезны.
PM MAIL   Вверх
Veitmen
Дата 5.12.2007, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 10.11.2006
Где: СПБ

Репутация: 3
Всего: 4



Не правильно рассуждаешь. Открытие и закрытие транзакции нужно там, гду ты уже сохраняешь объект в БД, а не при открытии формы. Работаешь так:
- Открыл форму
- Пользователь все вводит нажимает сохранить
- Создаешь объект хибера и заполняешь его, при заполнении идет рповерка значений
- ЗАполнил, передаешь этот объект в какой нить свой класс, типа контроллера и сохраняешь его там.
Сохранение в котроллере:

Код

public int SaveElement(DataElement el)
        {
            ISession session = _sessions.OpenSession();
            ITransaction tx = null;
            try
            {
                tx = session.BeginTransaction();
                int ID = (int)session.Save(el);
                tx.Commit();
                return ID;

            }
            catch (HibernateException e)
            {
                if (tx != null) tx.Rollback();
                throw e;
            }
            finally
            {
                session.Close();
            }
        }


Получается что твоя транзакция нужна только при сохранении.

Добавлено @ 09:03
Цитата(MFSham @ 4.12.2007,  19:20)
Использую DataSet в моем приложении пользователь мог внести ряд изменений в БД, открыв при том соответствующее окно редактирования. При его закрытии спрашивалось, сохранять ли изменения в БД. Соответственно если хотел - AcceptChanges, иначе откат. Т.к. база была отсоединена, соответственно все изменения производились в DataSet'e, то и все было хорошо.

То есть ты уже занес в DataSet данные и если пользователь не хочет сохранять, тогда Rollback???? smile 
А спросить и в зависимости от этого просто начинать сохранять или не сохранять даже... 

Это сообщение отредактировал(а) Veitmen - 5.12.2007, 09:04
PM MAIL ICQ   Вверх
MFSham
Дата 5.12.2007, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 28.8.2005
Где: Беларусь, Гродно

Репутация: нет
Всего: 3



В том то и загвоздка, что пользователя спрашивают 2 раза: 1 раз сохранить локально, чтобы не потерялась проделанная работа, а второй раз при закрытии формы, сохранить ли все наработки в БД.

Так вот, когда спрашиваю 1 раз - соответственно открываю транзакцию, сохраняю, закрываю. Таких сохранений может быть много. Т.е. транзакция открывается ни один раз.

2 раз я спрашиваю при закрытии формы о сохранении в БД. Вот тут то и получается, что данные то уже сохранены в БД, соответственно и откатить их нельзя. Вот и спрашиваю как быть.
--------------------
Без ветра трава неподвижна. Без программ компьютеры бесполезны.
PM MAIL   Вверх
Veitmen
Дата 5.12.2007, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 10.11.2006
Где: СПБ

Репутация: 3
Всего: 4



Цитата(MFSham @ 5.12.2007,  14:23)
В том то и загвоздка, что пользователя спрашивают 2 раза: 1 раз сохранить локально, чтобы не потерялась проделанная работа, а второй раз при закрытии формы, сохранить ли все наработки в БД.

Так вот, когда спрашиваю 1 раз - соответственно открываю транзакцию, сохраняю, закрываю. Таких сохранений может быть много. Т.е. транзакция открывается ни один раз.

2 раз я спрашиваю при закрытии формы о сохранении в БД. Вот тут то и получается, что данные то уже сохранены в БД, соответственно и откатить их нельзя. Вот и спрашиваю как быть.

Если ты работаешь с БД локально без соединения, т.е. через DataSet, то тебе транзакции и не нужны будут. Просто перед добавлением в DataSet спрашивай его, хочет он или нет. А вот при закрытии, спрашивай хочет ли он сохранить и потом начинай сохранять свой DAtaSet. Там уже транзакции тебе понадобятся.

А вообще, я не понимаю зачем ты так делаешь. Спрашивай у юзверя одни раз, уверен он или нет. Уверен начинай сохранять. При сохранении ошибка, откатываешь транзакцию. Вот так мне кажется гораздо вернее сделать. Чем переспрашивать у бедного юзверя.))

Транзакция, нужна только при работе с самой БД. Но не как не с DataSetом. 

Это сообщение отредактировал(а) Veitmen - 5.12.2007, 16:06
PM MAIL ICQ   Вверх
Veitmen
Дата 5.12.2007, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 10.11.2006
Где: СПБ

Репутация: 3
Всего: 4



http://www.codeproject.com/KB/architecture...chitecture.aspx - хорошая реализация работы транзакций под хибернейт.
PM MAIL ICQ   Вверх
MFSham
Дата 5.12.2007, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 28.8.2005
Где: Беларусь, Гродно

Репутация: нет
Всего: 3



Цитата(MFSham @  4.12.2007,  19:20 Найти цитируемый пост)
Решил вот переделать(а заодно и попробовать в действии NHibernate) свой проект, который работал на Typed DataSet.

C DataSet у меня все пректасно работает. 
Согласен, что 2 раза у юзверя спрашивать это глупо, но в моей ситуации это оптимальный вариант. Да и просят так сделать =\

Я все-таки сделал как хотел, но немного по другому. Пользователь загружает в окно для изменений определенный набор данных (в моем случае это небольшой набор). Я их соответственно при загрузке формы загружаю в массив объектов. И если юзверь что-то изменил, то изменяю только в массиве. Ну а при закрытии, если надо сохранить, то данные из этого массива сохраняю в БД. Но это прокатывает в моем случае, если данные занимают малый размер. Думаю с большим набором данных это не особо прокатит.
--------------------
Без ветра трава неподвижна. Без программ компьютеры бесполезны.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0482 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.