Откат транзакции в репозитории из другого класса - PullRequest
1 голос
/ 22 июня 2011

Ну, моя проблема: у меня есть такой метод:

class Manager
{
    void method1()
    {
        // save object in database to get ID
        int newId = this.Repository.Save(obj);

        try {
            // call remote webservice to save another object with same ID as in local DB
            webservice.Save(remoteObj, id); 
        }
        catch(Exception e)
        {
            // do Rollback in Repository here
        }
    }
}

По сути, это код.Репозиторий использует NHibernate для сохранения в БД.Мне нужно сохранить в БД, чтобы узнать новый идентификатор, а затем отправить этот идентификатор в веб-сервис.Если что-то не получается при вызове веб-службы, я хочу выполнить откат и сброс сохраненного объекта .... и вот моя проблема.Я не могу открыть и контролировать транзакцию в репозитории из моего диспетчера классов.

Я уже пробую с этим также:

class Manager
{
    void method1()
    {
        using (TransactionScope scope = new TransactionScope())
        {
           // save object in database to get ID
           int newId = this.Repository.Save(obj);

           // call remote webservice to save another object with same ID 
           // as in local DB
           webservice.Save(remoteObj, id); 
           scope.Complete();
        }
    }
}

Здесь проблема в том, что откат в порядке, но неСохранить (Создать в NHibernate).Я получаю сообщение об ошибке, что объект «Транзакция» не найден или транзакция уже закрыта сразу после строки: «scope.Complete ();».

Я думаю, что что-то не так, пытаясь контролировать транзакцию NHibernate с помощьюTransactionScope.

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

любая помощь или идея, где найти ??

Большое спасибо !!

1 Ответ

0 голосов
/ 28 июня 2011

Если у вас уже есть открытый сеанс в свойстве / переменной CurrentSession и что вы можете передать этот рабочий сеанс в свой репозиторий, я бы сделал следующее:

using(var trx = CurrentSession.BeginTransaction())
{
    try
    {
        int newId = this.Repository.Save(obj, CurrentSession);  
        webservice.Save(remoteObj, id);

        trx.Commit();
    }
    catch
    {
        trx.Rollback();
    }
}
...