Question

J'utilise des intercepteurs NHibernate pour enregistrer des informations sur les mises à jour / insertions / suppressions à mes différentes entités.

inclus dans les informations enregistrées est le type d'entité et l'identifiant unique de l'entité modifiée. L'ID unique est marqué comme un <generator class="identity"> dans le fichier de mappage NHibernate.

Le problème évident est lors de la connexion d'une opération d'insertion à l'aide IInterceptor.OnSave () l'identifiant de l'entité n'a pas encore été attribuée.

Comment puis-je obtenir l'identifiant de l'entité insérée avant de vous connecter les informations d'audit?

(j'ai regardé dans le cas des auditeurs NHibernate, mais ne peut pas les faire fonctionner avec la configuration Spring.net utilisé, donc je voudrais rester avec intercepteurs si possible)

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;            
    }
Était-ce utile?

La solution

J'ai travaillé autour de ce problème en ajoutant une liste à ma classe intercepteur qui est peuplé d'objets lors de la mise en œuvre du OnSave.

Dans la mise en œuvre de PostFlush la liste est itéré et chaque élément est vérifié comme un insert. Les objets de cette liste ont été persisté dans PostFlush() et ont donc généré ID.

Cela semble fonctionner OK mais je serais reconnaissant de bien vouloir les pièges potentiels ont été signalées: -)

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

Autres conseils

essayez la méthode OnFlushDirty .. ou peut-être PostFlush

edit: aussi, pouvez-vous envoyer votre code? Ne vous obtenez l'ID en tant que paramètre OnSave?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top