2012-01-25 11 views
1

この問題は、データマネージャの他の多くの場所で機能するため、非常に奇妙です。何らかの理由で、以下のように記述された新しいコードではエラーは発生しませんが、データベースでは更新されません。システムメモリ内のセッションは正しく見えますが、.Commit()が呼び出されたときに変更は適用されません。Hibernateセッションの変更がデータベースに永続化されていない

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を使用しています。ここでも、上記と同様の以前のコードは期待通りに動作しますが、新しいコードでは動作しません。

私たちはセッションを直接使用しているので、私はこのトピックについてほとんど助けを得ていません。何か案は?

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 [37] 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

掘削した後、Autoに設定されます。 – 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

関連する問題