未将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();
}