2009-06-17 6 views
0

Quelle est la méthode recommandée pour mettre à jour une entité? Jusqu'à présent, j'ai compris deux façons:Mise à jour d'une entité avec NHibernate dans Asp.Net

  1. Juste créer une nouvelle entité avec l'ID existant et la valeur des propriétés mises à jour et l'utilisation Session.saveOrUpdate()
  2. Utilisez un DTO, permet de récupérer l'entité existante en utilisant session. Chargez (dto.Id), attribuez de nouvelles valeurs à l'outil, puis enregistrez.

No1 nécessite beaucoup moins d'efforts, mais parfois je reçois une exception: "un objet différent avec la même valeur d'identifiant était déjà associé à la session". Y a-t-il un moyen simple de contourner cela?

No2 pourrait nécessiter un voyage supplémentaire à la DB je suppose?

Désolé si cela a déjà été répondu, n'a pas pu trouver la réponse.

Merci Ulu

Répondre

2

Votre deuxième option avec DTO est ma façon préférée. Vos DTO doivent être spécifiques à l'écran (DTO Google Screen Bound) afin que l'écran et votre domaine puissent changer indépendamment les uns des autres.

Il n'ajoutera pas non plus de déplacement supplémentaire à la base de données puisque le numéro 1 nécessiterait une entité déconnectée qui devra être reconnectée (ce qui déclenchera une sélection) après le fait. S'inquiéter d'une sélection supplémentaire sent aussi fortement l'optimisation prématurée.

En termes de conversion de domaine en DTO, je recommande de regarder AutoMapper.

+0

Merci Oui, je suis en train d'envisager AutoMapper. Avez-vous déjà essayé de l'utiliser dans l'autre sens - dto to entity? – ulu

+0

Je ne l'ai pas fait depuis .Net 3.5 et nous sommes coincés dans la terre 2.0 mais j'ai entendu beaucoup de bonnes choses à ce sujet, donc je n'hésiterais pas à l'utiliser si je le pouvais. –

1

Pour utiliser No1, vous pouvez essayer de Expulser l'objet de la session nHibernates. Cela va se débarrasser de l'erreur sur l'objet déjà dans la session.

Je recommanderais l'approche numéro 2. Surtout si vous voulez ajouter n'importe quel type de verrouillage optomiste. Dans de nombreux cas, un seul coup supplémentaire à la DB ne sera pas si cher.

Modifier

Pour vérifier si une entité existe déjà dans la session, vous pouvez utiliser la méthode Contient (obj) sur l'instance de session.

+0

Merci pour la réponse! Je pensais à Evict, mais je ne savais pas comment vérifier si une entité avec la même clé était déjà là, donc à ce moment-là la solution # 2 est devenue plus simple. Je voudrais ajouter votre réponse aussi correcte, mais le système ne me laissera pas marquer plus d'une réponse .. – ulu

Questions connexes