Pregunta

Estoy utilizando interceptores de NHibernate para registrar información sobre actualizaciones / Inserción / Elimina a mis diversas entidades.

Se incluye en la información registrada es el tipo de entidad y el identificador único de la entidad modificada. El identificador único se marca como un <generator class="identity"> en el archivo de asignación de NHibernate.

El problema obvio es al iniciar sesión una operación de inserción usando IInterceptor.OnSave () el ID de la entidad todavía no se ha asignado.

¿Cómo puedo obtener el identificador de la entidad insertada antes de iniciar la información de auditoría?

(He mirado en caso de NHibernate oyentes postSave pero no puede conseguir que el trabajo con la configuración Spring.net siendo utilizado, por lo que me gustaría seguir con interceptores si es posible)

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;            
    }
¿Fue útil?

Solución

He trabajado en torno a este problema mediante la adición de una lista a mi clase de interceptor, que se rellena con objetos durante la ejecución OnSave.

En la implementación PostFlush la lista se repiten a lo largo y cada elemento es auditada como un inserto. Los objetos de esta lista se han persistido en PostFlush() y de este modo han generado IDs.

Esto parece funcionar bien, pero yo estaría muy agradecido si cualquier peligros potenciales se señalaron: -)

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

Otros consejos

probar el método de OnFlushDirty .. o tal vez PostFlush

Edit: También, se puede publicar su código? No se obtiene el Id como un parámetro para OnSave?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top