2010-07-14 117 views
5

当我从数据库中检索的记录列表中更新(使用刷新)时,nHibernate将对原始列表中的所有记录进行版本控制。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的更新中的所有记录时,他们并没有改变,你如何制止这种行为?

+1

UnitOfWork.Start()是否创建一个新的NHibernate会话? – 2010-07-14 16:19:03

回答

9

这是最有可能您正在运行到这个问题:http://nhforge.org/blogs/http://nhibernate.info/blog/2008/10/20/how-test-your-mappings-the-ghostbuster.html

这将有助于看到工作映射文件。如果你正在做一些像

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

哪里Status实际上是StatusEnum你会鬼影结束。

+0

因此,Flush()试图将所有“脏”对象写入数据库,而不仅仅是我明确称为“Save()”的对象? – brainimus 2010-07-14 17:05:17

+0

是的。但是,“脏”的含义可能会让人困惑。例如,你有Job.Status这是存储的,因为我假设在数据库中是一个整数,但是在对象模型中是一个枚举。即使值匹配,NHibernate也会将这种差异看作“脏”。 – 2010-07-14 18:53:08

+1

不幸的是,现在我无法发布整个映射文件,因为它包含敏感项目。我可以说,你拥有的Status属性的例子就是我所拥有的。我已经改变了映射指向我的作业类中的一个int字段,属性把它转换为enum。可能值得注意的是,作业包含一系列使用相同枚举的其他对象,但我也已将映射文件更新为类中的字段,并且属性将该字段转换为枚举。虽然我仍然有同样的问题。 – brainimus 2010-07-15 20:21:17