这个问题非常奇怪,因为它适用于我们数据管理器的许多其他地方。出于某种原因,任何新的代码编写如下都不会引发错误,但它不会在数据库中更新。系统内存中的会话看起来是正确的,但是在调用.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,如果这很重要的话。同样,以前类似于上面的代码按预期工作,但任何新代码都没有。
由于我们直接使用会话,因此我在这个主题上找不到什么帮助。有什么想法吗?
修改
log4net日志说明如下:2012-01-24 11:39:13,475 [37] DEBUG NHibernate.Event.Default.AbstractSaveEventListener [(null)]&lt;(null)&gt; - 持久化实例:IDOI.Certificate.Domain.Model.Policy.InsuranceCertificate 2012-01-24 11:39:13,475 [37] DEBUG NHibernate.Event.Default.DefaultSaveOrUpdateEventListener [(null)]&lt;(null)&gt; - 忽略持久化实例2012-01-24 11:39:13,475 [37] DEBUG NHibernate.Event.Default.DefaultSaveOrUpdateEventListener [(null)]&lt;(null)&gt; - 已与会话关联的对象:[IDOI.Certificate.Domain.Model.Policy.InsuranceCertificate#5]
答案 0 :(得分:1)
看起来你正试图从存储库中获取一个实体,更改它,然后重新添加它。我不确定你的存储库实现,但是在注释中给出调试跟踪,会话已经是已添加到会话中 - 此时它将是更新而不是所需的插入。
尝试:
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();
}