2010-07-14 78 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