1

アプリケーションで流暢な NHinernate をすべてカスケード オプションで使用しています。

多数のエンティティと関係を含む複雑なモデルがあります。すべてが 1 つのエンティティ (コントラクト) によって保持され、他のエンティティのコレクションがいくつかあります。これらのエンティティには、他のエンティティ/エンティティのリストへの参照があります。

全体を保存したいときは、次のようにします。

mySession.Save(myContract);
myTransaction.Commit()

正常に動作し、カスケードのおかげですべてのエンティティが保存されます。

問題は、更新時に ModifiedBy、ModifiedTime などのプロパティを設定する必要があることです。これどうやってするの?

4

1 に答える 1

3

最も簡単な方法は、更新する必要があるプロパティのインターフェイスを作成することです。

public interface IAudit
{
    string ModifiedBy { get; set; }
    DateTime ModifiedTime { get; set; }
}

次に、 を追加しNHibernateInterceptorてプロパティを更新します。

public class AuditInterceptor : EmptyInterceptor
{
    public override bool OnSave(object entity, object id, object[] state, string[] propertyNames, IType[] types)
    {
        var auditableEntity = entity as IAudit;
        if (auditableEntity != null)
        {
            auditableEntity.ModifiedTime = DateTime.Now;
            // ...
        }

        return base.OnSave(entity, id, state, propertyNames, types);
    }
// ...
}

次に、NHibernate にインターセプターを使用するように指示する必要があります。正しく覚えていれば、次のように実行されます。

var session = SessionFactory.OpenSession(new AuditInterceptor());

セッションなどの管理方法に応じて、これがどこに行くかによって異なります。AuditInterceptor状態がないため、マルチスレッドの問題を心配することなくシングルトンとして存在できます。

于 2013-04-18T11:39:09.107 に答える