Frage

Ich verwende NHibernate Abfangjäger Informationen über Updates / Inserts / Löscht auf meine verschiedenen Einheiten loggt sein.

in der Information enthält angemeldet ist die Entitätstyp und die eindeutige ID des Unternehmens geändert. Die eindeutige ID wird als <generator class="identity"> in der NHibernate-Mapping-Datei markiert.

Das offensichtliche Problem ist, wenn eine Insert Operation Anmeldung IInterceptor.OnSave () verwendet die Id des Unternehmens noch nicht zugeordnet wurde.

Wie kann ich die Id der eingesetzten Einheit erhalten, bevor Sie die Audit-Informationen Anmeldung?

(ich habe sah in NHibernate Hörern postsave Ereignis, aber kann sich nicht bekommen arbeiten, mit der Spring.net Konfiguration verwendet wird, so würde Ich mag mit Abfangraketen bleiben, wenn überhaupt möglich)

Code:

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

Lösung

Ich habe, um dieses Problem gearbeitet, indem eine Liste meines Interzeptorklasse Zugabe, die mit Objekten während der OnSave Implementierung bevölkert wird.

In der PostFlush Implementierung wird die Liste iteriert und jedes Element wird als Einsatz geprüft. Die Objekte in dieser Liste haben in PostFlush() und somit haben generiert IDs beibehalten worden.

Das scheint gut zu funktionieren, aber ich wäre dankbar, wenn irgendwelche möglichen Gefahren aufgezeigt: -)

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

Andere Tipps

versuchen, die OnFlushDirty Methode .. oder vielleicht PostFlush

edit: auch, können Sie Ihren Code schreiben? Sie nicht die Id als Parameter erhalten OnSave?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top