2009-05-06 9 views
0

Existe-t-il un moyen pour que NHibernate ne mette à jour que les champs dont la valeur par défaut n'a pas été renseignée? Disons que nous avons cette classe simple:Mise à jour des propriétés remplies uniquement

public class Person 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

Nous avons aussi un mapping standard NHibernate en utilisant les propriétés pour chaque champ et Id pour le champ Id. Supposons que nous voulions qu'une page mette à jour le nom. Nous envoyons donc l'identifiant, le stockons dans un champ masqué et affichons une zone de texte pour le nom. L'utilisateur modifie le nom et enregistre les sauvegardes. Nous POSTONS de nouveau, ajoutons un objet Personne et assignons l'identifiant et le nom entrant. Nous disons ensuite à NHibernate de mettre à jour la base de données.

Le problème est, l'âge est évidemment remis à 0 dans la base de données car il n'a pas été rempli à partir du POST. Le moyen le plus évident consiste à envoyer la valeur Age à la page, à la stocker dans un champ caché et à la remplir avant de l'enregistrer. Cela fonctionne bien jusqu'à ce que vous obteniez un peu plus de propriétés sur votre objet et que vous vouliez seulement en modifier une main à l'écran (ou une grande liste d'objets Person, ce qui peut nécessiter de stocker beaucoup de valeurs dans des champs masqués). Pour revenir à l'objet de la question: est-il possible de dire à NHibernate d'ignorer la propriété Age, car elle aurait une valeur par défaut (0) avant d'être mise à jour, ou suis-je coincé avec une tonne de champs cachés pour conserver les valeurs existantes?

Répondre

0

Cela semble un peu suspect. Normalement, lorsque vous modifiez une entité Hibernate, vous devez d'abord la charger dans la base de données, y apporter des modifications, puis la sauvegarder dans la base de données. Normalement, vous ne créez pas un nouvel objet, ne définissez pas son ID et quelles que soient les propriétés arbitraires, puis enregistrez le nouvel objet car, comme vous le dites, les propriétés qui ne sont pas définies seront très probablement définies par défaut. En le chargeant à partir de la base de données, toutes les propriétés sont remplies de façon appropriée, vous n'avez donc pas à vous soucier de maintenir vous-même l'état de celles-ci. La session Hibernate est responsable du maintien de l'état de ces objets jusqu'à ce que vous les sauvegardiez et les vidiez dans la base de données.

Il existe différentes stratégies pour gérer la session de mise en veille prolongée sur les requêtes Web. Consultez cet article: http://hibernatebp.blogspot.com/ - regardez les stratégies de gestion de session. "Session par requête avec des objets détachés" pourrait être bien dans votre cas.

+0

Oui, je peux charger la personne, définir son nom et l'enregistrer. Cependant, ceci est pour une plus grande liste de tels objets, donc je fais soit une charge par objet, soit je les récupère tous et j'effectue une recherche depuis la collection in memory pour trouver l'entité correcte à mettre à jour moi-même. De toute façon est une douleur (bien que faisable). Je me demandais s'il y avait un moyen plus facile. –

1

Dans la publication, extrayez l'entité persistante du référentiel avec l'ID et mettez à jour uniquement le nom et le conserver. De cette façon, vous n'avez pas besoin de maintenir les valeurs dans un champ caché.

+0

Dans cet exemple artificiel, il y a déjà un Age dans la base de données et il ne peut pas être nul. Je ne veux tout simplement pas que NHibernate écrase la valeur existante lors de la mise à jour. –

+0

Vérifiez la réponse mise à jour –

+0

Voir l'autre réponse (http://stackoverflow.com/questions/831527/only-updating-filled-in-properties/831579#831579). Je sais que je peux le faire, mais si j'ai une grande collection d'objets pour le faire, j'essayais d'éviter cela ou de les charger tous en même temps, puis de modifier la collection. On dirait que ce sont les deux seules options. –

Questions connexes