NHibernate 인터셉터 감사 삽입 된 객체 ID
-
23-08-2019 - |
문제
Nhibernate 인터셉터를 사용하여 다양한 엔티티에 업데이트/인서트/삭제에 대한 정보를 기록하고 있습니다.
로지 된 정보에는 엔티티 유형과 수정 된 엔티티의 고유 ID가 포함되어 있습니다. 고유 한 ID는 a로 표시됩니다 <generator class="identity">
nhibernate 매핑 파일에서.
명백한 문제는 iinterceptor.onsave ()를 사용하여 삽입 작업을 기록 할 때 엔티티의 ID가 아직 할당되지 않은 것입니다.
감사 정보를 기록하기 전에 삽입 된 엔티티의 ID를 얻으려면 어떻게해야합니까?
(Nhibernate Listeners Postsave 이벤트를 살펴 보았지만 Spring.net 구성을 사용하는 작업을 수행 할 수는 없으므로 가능한 경우 인터셉터를 고수하고 싶습니다).
암호:
// object id parameter is null...
public override bool OnSave(object entity, object id, object[] state,
string[] propertyNames, IType[] types)
{
AddAuditItem(entity, INSERT);
return false;
}
해결책
나는이 문제를 해결했는데, 내 인터셉터 클래스에 목록을 추가하여 OnSave
구현.
에서 PostFlush
구현 목록이 반복되고 각 요소는 삽입물로 감사됩니다. 이 목록의 개체는 지속되었습니다 PostFlush()
따라서 ID를 생성했습니다.
이것은 잘 작동하는 것 같지만 잠재적 인 함정이 지적되면 감사 할 것입니다 :-)
public class AuditInterceptor : EmptyInterceptor
{
// To hold inserted items to be audited after insert has been flushed
private IList<object> insertItems = new List<object>();
public override void PostFlush(System.Collections.ICollection entities)
{
foreach (var entity in insertItems)
{
AddAuditItem(entity, INSERT);
}
insertItems.Clear();
base.PostFlush(entities);
}
public override bool OnSave(object entity, object id, object[] state,
string[] propertyNames, IType[] types)
{
var auditable = entity as IAuditable;
if (auditable != null)
insertItems.Add(entity);
return false;
}
}
다른 팁
시도해보십시오 OnFlushDirty
방법 .. 또는 아마도 PostFlush
편집 : 또한 코드를 게시 할 수 있습니까? ID를 매개 변수로 얻지 마십시오 OnSave
?
제휴하지 않습니다 StackOverflow