NHibernateはIInterceptor内のオブジェクトを保存します
-
18-09-2019 - |
質問
私は自分のドメインモデルでILoggableオブジェクトに対してIInterceptorを設定します。そしてOnFlushDirtyイベントに、私は、ログ(監査)を保存しようとしています。これを実行しながら、しかし、私のコードは無限ループに入ります。
_logrepository.Save(ログ)ログはILoggableオブジェクトでない場合であってもOnFlushDirty呼び出します(エンティティがまだ前のオブジェクトであるので、それはある)
IInterceptorに(別のセッションを開くことなく).SAVEを使用する方法はありますか、私はIInterceptorにデータベースにログをどのように挿入していますか?
public override bool OnFlushDirty(object entity, object id, object[] currentState, object[] previousState, string[] propertyNames, NHibernate.Type.IType[] types)
{
//find diffs, log each change
if (entity is ILoggable && entity is NamedEntity)
{
var namedEntity = entity as NamedEntity;
for (var i = 0; i < currentState.Count(); i++)
{
if (currentState[i] != previousState[i])
{
var log = new Log()
{
Description = "update",
InDate = namedEntity.ModifiedDate.Value,
ItemId = namedEntity.Id,
ItemType = namedEntity.GetType().Name,
NewValue = currentState[i].ToString(),
OldValue = previousState[i].ToString(),
PropertyName = propertyNames[i],
UserId = namedEntity.ModifiedByUserId.Value
};
// calling save calls onflushdirty again, where entity is not log, but the same entity of the first call
ObjectFactory.GetInstance().Save(log);
}
}
}
return base.OnFlushDirty(entity, id, currentState, previousState, propertyNames, types);
}
解決
[OK]を、私は私の問題は、_logrepository.Saveは(ログ)別のトランザクションを開いて、それをコミットしていた、それを考え出しました。 だから、私は開いて、別のトランザクションをコミットしたが、オープン・トランザクションを使用しないlogrepository.Save(ログ)を変更します。
所属していません StackOverflow