2009-10-22 6 views
3

Je voudrais savoir s'il existe un moyen de rendre une instance d'une entité immutable à l'exécution. Je sais que je peux avoir des types readonly, mais je voudrais des instances readonly de types à l'exécution. Raison d'être, que je veux utiliser des objets de domaine NH comme une entité légère en modifiant les propriétés, mais ne veulent pas que ces changements persistent en faisant un Session.Flush() ou similaire. Il y a toujours Session.Evict(), mais cela n'empêchera pas le développeur inconscient d'une Session.Save() sur une entité "readonly".NHibernate Readonly Entities at Runtime

+0

J'ai 2 questions: 1. Pourquoi et quand avez-vous besoin des versions en lecture seule des entités? 2. Quand le "run-time" commence-t-il? – Paco

+0

"Pourquoi" - parce que dans certains cas, nous aimerions contourner l'état d'un objet en mémoire sans persister dans la base de données. La plupart des puristes diraient que vous créez une entité légère distincte, mais je considère que ce n'est pas très pragmatique dans les cas simples. Une chose que je n'aime pas à propos de NH, c'est que les flushs persistent automatiquement à l'état changé, un principe déclaré de la conception. J'aime * utiliser des déclarations explicites pour persister dans mes objets, c'est pourquoi je suis intrigué par la réponse de Mauricio Scheffer. "Quand avez-vous besoin de versions en lecture seule des entités ... quand 'runtime' démarre-t-il?" - Après charge – Trent

Répondre

5

Au moment de l'exécution hein? Je suis encore un peu perplexe avec exactement ce que votre demande, mais je l'ai fait quelque chose comme ça dans le passé:

foreach (var order in orders) 
{ 
    _nhSession.SetReadOnly(order, true); //prevent database updates 
} 

Je l'ai fait un certain temps parce que quand j'ai demandé une liste des commandes, une partie des les propriétés de l'entité n'ont pas été rendues nulles alors qu'elles auraient dû l'être. Ainsi, lorsque NHibernate a effectué le vidage, il essayait de mettre à jour toutes mes commandes et de mettre les valeurs nulles de la base de données à la valeur par défaut de la base de données. .

1

Jetez un oeil à this article by Fabio Maulo, vous pouvez l'utiliser comme point de départ et le modifier pour suivre des entités individuelles.

+0

Ceci est une chose intéressante à considérer. Je ne peux pas l'utiliser dans notre solution avec des dépendances héritées sur le comportement de vidage existant. Cependant, j'aime voir où les hooks sont dans l'état d'instance, ce qui pourrait m'inciter à ajouter des surcharges à NH pour GetReadOnly ou ListReadOnly <>, ou quelque chose de similaire. – Trent