0 votes

Détermination du champ par formule lors de l'insertion dans NHibernate

J'utilise NHibernate 2.1. J'insère avec succès des enregistrements dans une table, mais j'ai une colonne SortOrder qui doit être calculée lors de l'insertion. La formule sera en gros la suivante :

SortOrder = (SELECT (MAX(SortOrder) + 1) FROM MyTable WHERE CategoryID = @CategoryID)

Comment puis-je réaliser cela dans NHibernate sur les insertions ? Normalement, j'utilise des procédures stockées et je devrais simplement y inclure cette opération.

Merci pour toute aide !

0voto

tolism7 Points 1857

Je n'ai pas connaissance d'un moyen de faire ce que vous demandez par le biais des fichiers de cartographie. Je ne pense pas qu'il en existe un.

La façon dont j'aborderais le problème est de brancher un PreInsertListener et de faire l'instruction de sélection que vous fournissez dans votre question pour récupérer la valeur de la réponse SortOrder juste avant que l'entité ne soit enregistrée.

Voici à quoi cela ressemblerait en gros :

public class NHibernateEventListeners : IPreInsertEventListener
{
    public bool OnPreInsert(PreInsertEvent auditEvent)
    {
        var audit = auditEvent.Entity as YourEntityTypeHere;

        if (audit == null)
            return false;

        int sortOrderValue = 
           (int)auditEvent.Session.CreateCriteria<YourEntityTypeHere>()
                .SetProjection(Projections.Max("SortOrder"))
                .Add(Restrictions.Eq("CategoryID", CatID)).UniqueResult();

        SetValue(auditEvent.Persister, auditEvent.State, "SortOrder", sortOrderValue + 1);

        audit.DateCreated = sortOrderValue + 1;

        return false;
    }
}

0voto

Nathan Fisher Points 4401

Vous pouvez toujours utiliser les procs stockés avec nhibernate. Vous devez implémenter <sql-insert> , <sql-update> y <sql-delete> dans le fichier de mapping xml pour faire du CRUD spécialisé. Je pense que ce sera votre meilleure option compte tenu de votre scénario.

0voto

James Allen Points 1214

Dans votre fichier de mappage de classe, vous pouvez spécifier une formule SQL pour une colonne / propriété. Utilisation de fichiers de mappage XML :

<property name="SortOrder"  formula=" (SELECT (MAX(SortOrder) + 1) FROM MyTable WHERE CategoryID = @CategoryID)"/>

Ou si vous utilisez la cartographie fluide :

Map(x => x.SortOrder).FormulaIs(" (SELECT (MAX(SortOrder) + 1) FROM MyTable WHERE CategoryID = @CategoryID)");

Voyez si ça marche.

0voto

Leo Points 180

Vous pouvez écrire un déclencheur dans votre base de données mais soyez conscient des problèmes que pose cette approche car NHibernate ne sera pas au courant des modifications apportées à ce champ calculé. Vous devez utiliser la méthode Flush() après la sauvegarde et la méthode Refresh(your_data_object) après celle-ci.

Il existe une bonne explication détaillée sur le traitement des triggers dans le livre "NHibernate in Action" : "9.2.4 Working with triggers".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X