2009-07-20 12 views
11

私はDDDとNHibernateを使ってドメインオブジェクトを保持しています。私のデータベースでは、エンティティに関連するすべてのテーブルには、監査追跡に使用される4つの余分な列(CreatedBy、UpdatedBy、CreatedDate、UpdatedDate)があります。私は集約ルートを保存できるリポジトリパターンを使用しています。 NHibernateが集約ルート上のエンティティを保存しようとすると、エンティティに監査プロパティが設定されていないため、SQL DateTimeエラーが発生します。保存する直前にオブジェクトのプロパティを設定するNHibernateの方法はありますか?保存時にNHibernateのプロパティが自動的に設定される

ここは少しの例です。私は集計ルートであるOrderオブジェクトを持っています。注文の子であるOrderNoteオブジェクトもあります。 OrderNoteをOrderに追加してOrderを保存すると、CreatedDate/UpdatedDateがDateTime.MinValueに設定され、SQL DateTimeオーバーフローが発生するため、例外がスローされます。これらの監査列は永続性の一部であり、問​​題のドメインに関連していないため、ノートを追加したときにOrder集約ルートでこれらのプロパティを設定しないようにします。監査列/プロパティは、ドメインではなく永続性フレームワークによってのみ認識されるべきです。私は保存または更新時にこれらのプロパティを設定するようにNHibernateに指示することができたいと思います。これを行う方法はありますか?

http://www.nhforge.org/doc/nh/en/index.html#manipulatingdata-interceptors(9.10、リンクは常に動作しません):

答えて

11

インターセプタはこれを行うことができます。文書から

カット/ペースト:

public class AuditInterceptor : IInterceptor 
{ 
    ... 

    public boolean OnSave(object entity, 
          object id, 
          object[] state, 
          string[] propertyNames, 
          IType[] types) 
    { 
     if (entity is IAuditable) 
     { 
      for (int i=0; i<propertyNames.Length; i++) 
      { 
       if ("CreateTimestamp" == propertyNames[i]) 
       { 
        state[i] = DateTime.Now; 
        return true; 
       } 
      } 
     } 
     return false; 
    } 

} 

OnFlushDirtyは()UpdatedDateために使用することができます。

CreatedDate/UpdatedDateを持つすべてのエンティティにインターフェイスを実装し、インターセプタが動作する必要があるかどうかを確認できるようにします(この例ではIAuditableです)。


編集

ただ、気づい章11:インターセプタとイベント。 EmptyInterceptorから継承することで、いくつかのメソッドをオーバーライドするだけで済むようになります。

私はイベントを一度も使用していません。

+0

素晴らしいです。それがまさに私が探しているものです。私はNHibernateには新しく、この機能を知らなかった。私は保護されたプロパティで実装されたIAuditableインターフェイスを持っているので、ドメインはそれらを見ることができません。 – awilinsk

1

また、あなたのケースであなたを助けることができるNHibernateのバージョンシステムを見ることができます;)

関連する問題