未将NHibernate会话更改持久化到数据库

未将NHibernate会话更改持久化到数据库,nhibernate,fluent-nhibernate,persistence,Nhibernate,Fluent Nhibernate,Persistence,这个问题非常奇怪,因为它在我们的数据管理器中的许多其他地方都起作用。出于某种原因,任何按以下方式编写的新代码都不会抛出错误,但不会在数据库中更新。系统内存中的会话看起来是正确的,但调用.Commit()时不会进行任何更改 using (var scope = new UnitOfWorkScope()) { InsuranceCertificate cert = _certificateRepository.SingleOrDefault(x => x.Id

这个问题非常奇怪,因为它在我们的数据管理器中的许多其他地方都起作用。出于某种原因,任何按以下方式编写的新代码都不会抛出错误,但不会在数据库中更新。系统内存中的会话看起来是正确的,但调用
.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();
     }
使用(var scope=new UnitOfWorkScope())
{
InsuranceCertificateCert=\u certificateRepository.SingleOrDefault(x=>x.Id==certId);
证书状态=新枚举(证书状态已拒绝);
cert.RejectedDate=DateTime.Now;
cert.RejectedReason=原因;
_证书存放。添加(证书);
scope.Commit();
scope.Complete();
}
如果有必要的话,我们正在使用Fluent Nhibernate和Castle Windsor。同样,以前类似于上述代码的代码可以正常工作,但任何新代码都不能

因为我们直接使用了这个会话,所以我在这个主题上没有找到什么帮助。有什么想法吗

编辑


log4net日志显示以下内容:2012-01-24 11:39:13475[37]DEBUG NHibernate.Event.Default.AbstractSaveEventListener[(null)]-IDOI.Certificate.Domain.Model.Policy.InsuranceCertificate 2012-01-24 11:39:13475[37]DEBUG NHibernate.Event.Default.DefaultSaveOrUpdateEventListener[(null)]的持久实例-忽略持久实例2012-01-24 11:39:13475[37]调试NHibernate.Event.Default.DefaultSaveOrUpdateEventListener[(null)]-对象已与会话关联:[IDOI.Certificate.Domain.Model.Policy.InsuranceCertificate#5]


看起来您正试图从存储库中获取一个实体,对其进行更改,然后再将其添加回存储库。我不确定您的存储库实现如何,但考虑到注释中的调试跟踪,会话内容已经添加到会话中-此时它将是一个更新,而不是所需的插入

尝试:

使用(var scope=new UnitOfWorkScope())
{
InsuranceCertificateCert=\u certificateRepository.SingleOrDefault(x=>x.Id==certId);
证书状态=新枚举(证书状态已拒绝);
cert.RejectedDate=DateTime.Now;
cert.RejectedReason=原因;
scope.Commit();
scope.Complete();
}

看起来您正试图从存储库中获取一个实体,对其进行更改,然后将其添加回存储库。我不确定您的存储库实现如何,但考虑到注释中的调试跟踪,会话内容已经添加到会话中-此时它将是一个更新,而不是所需的插入

尝试:

使用(var scope=new UnitOfWorkScope())
{
InsuranceCertificateCert=\u certificateRepository.SingleOrDefault(x=>x.Id==certId);
证书状态=新枚举(证书状态已拒绝);
cert.RejectedDate=DateTime.Now;
cert.RejectedReason=原因;
scope.Commit();
scope.Complete();
}


您的
刷新模式设置为什么?未知。它都是通过我们的Global.asax.cs文件设置的。我假设默认值是什么。在进行一些挖掘之后,它被设置为自动。请共享您的UnitOfWorkScope类代码UnitOfWork来自NCommon.Data。我们没有它的源代码。您的
刷新模式设置为什么?未知。它都是通过我们的Global.asax.cs文件设置的。我假设默认值是什么。在进行一些挖掘之后,它被设置为自动。请共享您的UnitOfWorkScope类代码UnitOfWork来自NCommon.Data。我们没有它的源代码。我认为
commit
会自动完成它。不是吗?这是未知的-nhibernate没有“unitofworkscope”对象,所以它是他自己实现的。我要说的是,session.commit不一定会立即持久化。我的理解是,尽管有限,但scope.commit()会完成所有会话刷新。正如我在前面的文章中所说,这已经起作用了,对于我们的大多数方法来说,它仍然起作用。log4net日志说:2012-01-24 11:39:13475[37]DEBUG NHibernate.Event.Default.AbstractSaveEventListener[(null)](null)-的持久实例:IDOI.Certificate.Domain.Model.Policy.InsuranceCertificate 2012-01-24 11:39:13475[37]DEBUG NHibernate.Event.Default.DefaultSaveOrUpdateEventListener[(null)](null)-忽略持久实例2012-01-24 11:39:13475[37]DEBUG NHibernate.Event.Default.DefaultSaveOrUpdateEventListener[(null)](null)-对象已与会话关联:[IDOI.Certificate.Domain.Model.Policy.InsuranceCertificate\5]我修改了我的答案以考虑调试跟踪-您应该将其添加到原始问题中。我认为
commit
会自动执行。不是吗?这是未知的-nhibernate没有“unitofworkscope”对象,所以它是他自己实现的。我要说的是,session.commit不一定会立即持久化。我的理解是,尽管有限,但scope.commit()会完成所有会话刷新。正如我在前面的文章中所说,这已经起作用了,对于我们的大多数方法来说,它仍然起作用。log4net日志说:2012-01-24 11:39:13475[37]DEBUG NHibernate.Event.Default.AbstractSaveEventListener[(null)](null)-的持久实例:IDOI.Certificate.Domain.Model.Policy.InsuranceCertificate 2012-01-24 11:39:13475[37]DEBUG NHibernate.Event.Default.DefaultSaveOrUpdateEventListener[(null)](null)-忽略持久实例2012-01-24 11:39:13475[37]DEBUG NHibernate.Event.Default.DefaultSaveOrUpdateEventListener[(null)](null)-对象已与会话关联:[IDOI.Certificate.Domain.Model.Policy.InsuranceCertificate\5]我修改了我的答案以考虑调试跟踪-您应该将其添加到
     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();
        }