2012-01-25 119 views
1

這個問題很奇怪,因爲它在我們的數據管理器中的許多其他地方工作。出於某種原因,下面寫的任何新代碼都不會引發錯誤,但它不會在數據庫中更新。系統內存中的會話看起來是正確的,但在調用.Commit()時沒有更改。NHibernate會話更改沒有被保存到數據庫

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

我們正在使用流利的Nhibernate和溫莎城堡,如果那件事。同樣,以前的類似於上面的代碼也能按預期工作,但是任何新代碼都不會。

因爲我們直接使用會話,所以我在這個主題上找不到什麼幫助。有任何想法嗎?

EDIT

log4net的日誌說以下內容:2012-01-24 11:39:13475 [37] DEBUG NHibernate.Event.Default.AbstractSaveEventListener [(空)] <(空)> - 持久化實例:IDOI.Certificate.Domain.Model.Policy.InsuranceCertificate 2012-01-24 11:39:13 475 [DEBUG]調用NHibernate.Event.Default.DefaultSaveOrUpdateEventListener [(null)] <(null)> - 忽略持久化實例2012-01-24 11:39:13 475 [37] DEBUG NHibernate.Event.Default.DefaultSaveOrUpdateEventListener [(null)] <(null)> - 對象已經與會議有關:[IDOI.Certificate.Domain.Model.Policy.InsuranceCertificate#5]

+0

什麼是你的'FlushMode'設置? – vcsjones

+0

未知。它全部通過我們的Global.asax.cs文件進行設置。我會假設任何默認值。 – trambre

+0

做了一些挖掘之後,它被設置爲自動。 – trambre

回答

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(); 
     } 
+0

我認爲'commit'會自動執行。不是嗎? – gdoron

+0

那是未知的 - nhibernate沒有「unitofworkscope」對象,所以它實現了自己的一些東西。我會說session.commit不一定會立即保留。 – Fourth

+0

我的理解是,scope.commit()完成所有會話刷新。正如我在前面的文章中所說的那樣,這一直在發揮作用,對於我們大多數的方法,它仍然有效。 – trambre