문제

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?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top