NHibernate更新未更改的记录

NHibernate更新未更改的记录,nhibernate,Nhibernate,当我更新(刷新)从数据库检索到的记录列表中的一条记录时,nHibernate正在对原始列表中的所有记录进行版本控制 从数据库检索记录列表: using(UnitOfWork.Start()) { queuedJobs = aJobServiceManager.GetAllJobs().Where(aJob => aJob.Status == PricingStatus.QUEUED).ToList(); } /* Do some work on the record*/ using

当我更新(刷新)从数据库检索到的记录列表中的一条记录时,nHibernate正在对原始列表中的所有记录进行版本控制

从数据库检索记录列表:

using(UnitOfWork.Start())
{
   queuedJobs = aJobServiceManager.GetAllJobs().Where(aJob => aJob.Status == PricingStatus.QUEUED).ToList();
}

/* Do some work on the record*/
using(UnitOfWork.Start())
{
   //aJob is a record from queuedJobs.
   aJobServiceManager.Save(aJob);
   //When Flush is called I'm expecting only aJob to be updated in the database.
   //aJob is correctly updated BUT
   //All the other records in queuedJobs are also updated (their version field is incremented).
   UnitOfWork.Current.Flush();
}

为什么nHibernate会在所有记录没有更改的情况下更新它们?您如何停止这种行为?

这很可能是您遇到的问题:

查看作业的映射文件会有所帮助。如果你在做这样的事情

<property name="Status" type="int" /> 


其中
Status
实际上是
StatusEnum
您将以重影结束。

UnitOfWork.Start()是否创建新的NHibernate会话?因此Flush()尝试将所有“脏”对象写入数据库,而不仅仅是我显式调用的“Save()”对象?是的。但“肮脏”的含义可能有点令人困惑。例如,您有Job.Status,它在数据库中存储为一个整数,但在对象模型中是一个枚举。即使值匹配,NHibernate也会将此差异视为“脏”。不幸的是,此时我无法发布整个映射文件,因为它包含敏感项。但是我可以说,您拥有的Status属性的示例就是我拥有的。此后,我将映射更改为指向作业类中的int字段,属性处理将其转换为枚举。值得注意的是,该作业包含一包使用相同枚举的其他对象,但我还使映射文件更新了类中的一个字段,并且属性将该字段转换为枚举。我仍然有同样的问题。经过大量的挖掘,我找到了第二个发生这种情况的地方。在映射文件中,数据库中的值映射到属性。在我的类中,属性的setter将值分配给私有变量,如下所示:set{thePrivateVariable=value;}。一旦我更改映射以直接设置私有字段(private变量),我的问题就解决了。