2010-03-30 8 views
4

Cela semble être un problème commun, mais je ne connais pas la meilleure façon de le résoudre. Je souhaite être en mesure d'envoyer une Entité à une vue, d'apporter des modifications à l'entité dans la vue, puis d'annuler (supprimer) ces modifications si l'utilisateur annule la vue. Quelle est la bonne façon de le faire.NHibernate & Annulation des changements aux entités

Voici deux options que j'ai, mais je pense qu'il devrait y avoir d'autres qui sont mieux

1) Prendre une entité, créer un clone, envoyer le clone à la vue ... si des modifications sont acceptées, mettez à jour le Envoyer l'entité à la vue originale entité avec les valeurs

2) du clone, si l'utilisateur annule, retirez l'entité du cache de NHibernate et le recharger à partir de la base de données

pour (2), la question me serait soit que l'ancienne entité puisse toujours être référencée dans mon projet après qu'elle a été retirée du cache.

Edit:

Ok, donc la méthode est evict la voie à suivre si je suis méthode d'exécution (2). Merci, je ne pouvais pas me souvenir des détails de celui-là. Cependant, la question des objets de vue faisant référence à mes anciennes entités expulsées rend la question difficile à traiter. Je ne peux pas simplement faire en sorte que ma vue soit automatiquement mise à jour vers une nouvelle entité sans avoir de code personnalisé dans chacune d'entre elles pour la relancer lorsque mon événement d'éviction personnalisé est déclenché. Et la reliure peut ne pas être triviale dans certains cas. Je dois y réfléchir un peu plus car je suis peut-être trop compliqué mais pour l'instant, cette méthode semble plus délicate.

Je suppose que je vais être bloqué avec la méthode (1) qui a son propre ensemble de problèmes mais attendra un peu plus longtemps pour voir si quelqu'un d'autre a des idées.

Édition 2: Je viens de trouver ceci. Je pense que à peu près couvre la réponse en détail et est livré avec un grand projet de démonstration - Construire un bureau Choses à faire application avec NHibernate - http://msdn.microsoft.com/en-us/magazine/ee819139.aspx

En plus de cela, NHibernate a une Session.Refresh (entité objet) fonction qui semble résoudre le problème exact. Ainsi, lorsqu'une entité est modifiée mais annulée avant la sauvegarde, je peux simplement appeler Session.Refresh pour la recharger à partir de la base de données et rejeter les modifications.

+0

Un problème commun avec 'Refresh' se produit lorsque l'entité a établi des relations en cascade, alors ces enfants (les entités liées) seront également rafraîchis - Cela peut avoir un impact notable sur les performances. Je viens de faire face au problème que je décris, donc cette information peut aider les autres – jweyrich

Répondre

1

Je vais opter pour l'option 1 et utiliser ce qu'on appelle un ViewModel au lieu de votre entité. ViewModel est une représentation de votre modèle pour une vue spécifique. Dans ViewModel, vous pouvez mélanger des données provenant de différentes entités et pré-formater des valeurs pour les adapter à la vue. Est un moyen élégant de transmettre des données à une vue et vous pouvez accomplir ce que vous voulez facilement. L'utilisation de ViewModels devient la méthode de travail préférée dans ASP.net MVC et Silverlight/WPF.

Pour en savoir plus sur ViewModels: http://blogs.msdn.com/dphill/archive/2009/01/31/the-viewmodel-pattern.aspx

+0

J'ai fini par utiliser cette solution. Je ne trouve pas cela idéal cependant parce que parfois mes entités contiennent exactement ce qui devrait être à mon avis et je n'aime pas avoir à copier leurs propriétés sur autre chose. Pourtant, semble être ok pour la plupart. Merci – i8abug

+0

À la fin, vous vous habituerez à cela. Je recommande d'utiliser Automapper pour soulager la douleur de la copie de données dans les deux sens. http://automapper.codeplex.com/ –

+0

c'est douloureux au début, et l'idée d'implémenter un second type juste pour que vous puissiez changer la forme du modèle/des données en quelque chose qui correspond à la vue, m'a donné envie de crier! - Je me suis battu contre cette idée pendant près d'un an, et j'ai finalement dû faire face au fait que NH et ASP.NET MVC n'étaient tout simplement pas conçus pour une autre approche. Même si cela vous fait grincer des dents, je vous conseille fortement d'oublier DRY et d'accepter un haut degré de duplication; C'est pour ça que les outils ont été conçus. Nager contre le courant causera de la douleur et pas de véritables récompenses. –

1

La meilleure façon de faire est d'appeler la méthode Evict sur le ISession utilisé pour charger l'objet. Cela supprimera l'objet du cache de session. et vous pouvez ensuite le recharger et le réafficher. Si vous expulsez l'objet de la session, le se déconnecte et, s'il y a encore des références dans le projet, il ne sera pas conservé lorsque la session sera vidée. La façon dont vous gérez cela dépend de votre application, mais je suggère d'organiser un événement pour informer les abonnés qu'ils doivent recharger l'objet.

Questions connexes