Question

Nous utilisons le modèle DTO pour rassembler nos objets de domaine de la couche de service dans notre dépôt, puis vers le bas à la base de données via NHibernate.

J'ai rencontré un problème dans lequel je tire un DTO du référentiel (par exemple CustomerDTO) et puis le convertir dans l'objet de domaine (client) dans ma couche de service. J'essaie ensuite et enregistrer un nouvel objet en arrière (par exemple SalesOrder) qui contient le même objet client. Ceci est à son tour converti en un SalesOrderDTO (et CustomerDTO) pour pousser dans le référentiel.

NHibernate n'aime pas this- il se plaint que le CustomerDTO est un enregistrement en double. Je suppose que cela est parce qu'il a sorti la première CustomerDTO dans la même session et que le retour a été reconverti en arrière, il ne peut pas le reconnaître comme le même objet.

Suis-je coincé ici ou est-il un moyen de contourner cela?

Merci

James

Était-ce utile?

La solution

Vous pouvez rattacher un objet à une session NHibernate en utilisant Lock -. Par exemple

_session.Lock(myDetachedObject, NHibernate.LockMode.None);

qui peut ou ne peut pas aider selon exactement ce qui se passe ici. Sur une note de côté, utilise de DTO avec NHibernate n'est pas la pratique la plus courante, le fait que NHibernate (la plupart du temps) soutient l'ignorance de persistance signifie que généralement DTO ne sont pas aussi largement utilisé comme avec d'autres cadres ORM.

Autres conseils

Il est vraiment comment fonctionne la session NHibernate. Donc, si vous dans une session tirer une instance de votre CustomerDTO puis après un certain temps, vous devriez obtenir le même CustomerDTO (par exemple par clé primaire) - vous réellement obtenir référence à la même objet que vous avez fait dans votre première recherche

Alors qu'est-ce que vous faites est que vous soit fusionner les objets en appelant Session.merge ou vous demander votre session pour l'objet en appelant Session.get (primaryKey) faire vos mises à jour et rincer la session.

Cependant, comme suggéré par Steve - ce n'est pas habituellement ce que vous faites - vous voulez vraiment obtenir votre objet de domaine de la banque de données et utiliser DTO (si neede) pour transférer les données à l'interface utilisateur, quel que soit webservice ...

Comme d'autres l'ont noté, la mise en œuvre et Equals GetHashCode est un pas dans la bonne direction. Regardez aussi dans le soutien de NHibernate pour la « fixer » OU / idiome M.

Vous avez également la possibilité de nosetter.camelcase à votre disposition: http://davybrion.com/blog/2009/03/entities-required-properties-and-properties-that-shouldnt-be-modified/

De plus, je voudrais vous encourager à ne pas être dissuadés par le manque d'informations là-bas en ligne. Cela ne signifie pas que vous êtes fou, ou mal faire les choses. Cela signifie simplement que vous travaillez dans un cas limite. Malheureusement, les plus gros consommateurs de bibliothèques comme NHibernate sont assez petites en interne et / ou des applications web, où il existe la liberté de se pencher toute votre persévérance a besoin contre une seule base de données. En réalité, il existe de nombreuses exceptions à cette règle.

Par exemple, je travaille actuellement sur une application de bureau commercial où l'un de mes objets de domaine a ses données entre une base de données répartis CE SQL et les fichiers images sur le disque. Malheureusement NHibernate ne peut me aider avec la persistance de SQL CE. Je suis obligé d'utiliser une sorte de « Mapping Double » (voir Martin Fowler « Patterns de Enterprise application architecture "de ) carte mon modèle de domaine à travers une couche de dépôt qui sait quelles données va NHibernate et ce disque.

Il arrive. Il est un besoin réel. Parfois, un manque apparent dans un outil vous indique prenez une mauvaise approche. Mais parfois, la vérité est que vous venez êtes vraiment dans un cas limite, et la nécessité de construire certains de ces modèles pour vous-même pour le faire.

  

Je suppose que cela est parce qu'il   sorti le premier CustomerDTO dans   la même session et parce que la   retour a été reconverti et   ci ne peut pas reconnaître comme   même objet.

Vous avez raison. Mise en veille prolongée ne peut pas. Envisager d'appliquer Equals et Hashcode pour résoudre ce problème. Je pense qu'un rattachez ne peut fonctionner que si vous ne l'avez pas chargé l'objet dans cette session.

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