Pergunta

Eu estou usando interceptadores NHibernate para registrar informações sobre as atualizações / inserções / exclusões aos meus várias entidades.

Incluída na informação registrada é o tipo de entidade eo Unique ID da entidade modificado. A identificação única é marcada como um <generator class="identity"> no arquivo de mapeamento NHibernate.

O problema óbvio é quando registrando uma operação de inserção usando IInterceptor.OnSave () o Id da entidade ainda não foi atribuído.

Como posso obter o ID da entidade inserida antes de entrar as informações de auditoria?

(Eu olhei em Ouvintes NHibernate evento postSave mas não pode levá-los a trabalhar com a configuração Spring.net sendo usado, então eu gostaria de ficar com interceptores se possível)

Código:

    // object id parameter is null...
    public override bool OnSave(object entity, object id, object[] state, 
        string[] propertyNames, IType[] types)
    {            
        AddAuditItem(entity, INSERT);
        return false;            
    }
Foi útil?

Solução

Eu trabalhei em torno deste problema adicionando uma lista para minha classe interceptor que é preenchida com objetos durante a implementação OnSave.

Na implementação PostFlush a lista é iterada e cada elemento é auditado como uma inserção. Os objetos dessa lista foram persistiu em PostFlush() e, portanto, têm gerado IDs.

Isso parece funcionar OK, mas eu ficaria muito grato se qualquer armadilhas potenciais foram apontados: -)

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;            
    }
}

Outras dicas

tentar o método OnFlushDirty .. ou talvez PostFlush

edit: também, você pode postar seu código? Você não obter o ID como um parâmetro para OnSave?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top