Изменения сеанса NHibernate не сохраняются в базе данных - PullRequest
1 голос
/ 25 января 2012

Эта проблема очень странная, так как она работает во многих других местах нашего менеджера данных. По какой-то причине любой новый код, написанный как ниже, не выдает ошибку, но не обновляется в базе данных. Сеанс в системной памяти выглядит корректно, но при вызове .Commit() никаких изменений не происходит.

 using (var scope = new UnitOfWorkScope())
     {
         InsuranceCertificate cert = _certificateRepository.SingleOrDefault(x => x.Id == certId);

         cert.Status = new Enumeration<CertificateStatus>(CertificateStatus.Rejected);
         cert.RejectedDate = DateTime.Now;
         cert.RejectedReason = reason;

         _certificateRepository.Add(cert);

         scope.Commit();
         scope.Complete();
     }

Мы используем Fluent Nhibernate и Castle Windsor, если это имеет значение. Опять же, предыдущий код, аналогичный приведенному выше, работает, как и ожидалось, но любой новый код не работает.

Поскольку мы используем сессию напрямую, я мало что нашел по этой теме. Есть идеи?

EDIT

log4net регистрирует следующее: 2012-01-24 11: 39: 13,475 [37] DEBUG NHibernate.Event.Default.AbstractSaveEventListener [(null)] <(null)> - постоянный экземпляр: IDOI.Certificate.Domain .Model.Policy.InsuranceCertificate 2012-01-24 11: 39: 13,475 [37] ОТЛАДКА NHibernate.Event.Default.DefaultSaveOrUpdateEventListener [(null)] <(null)> - игнорирование постоянного экземпляра 2012-01-24 11:39: 13,475 [37] DEBUG NHibernate.Event.Default.DefaultSaveOrUpdateEventListener [(null)] <(null)> - объект, уже связанный с сеансом: [IDOI.Certificate.Domain.Model.Policy.InsuranceCertificate # 5]

1 Ответ

1 голос
/ 25 января 2012

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

Попробуйте:

     using (var scope = new UnitOfWorkScope())
        {
            InsuranceCertificate cert = _certificateRepository.SingleOrDefault(x => x.Id == certId);

            cert.Status = new Enumeration<CertificateStatus>(CertificateStatus.Rejected);
            cert.RejectedDate = DateTime.Now;
            cert.RejectedReason = reason;

            scope.Commit();
            scope.Complete();
        }
...