Quel est l’impact de paresseux = & # 8220; faux & # 8221; sur l'élément de classe de la cartographie NHibernate?

StackOverflow https://stackoverflow.com/questions/606488

  •  03-07-2019
  •  | 
  •  

Question

Je travaille avec un système traditionnel auquel j'essaie d'ajouter NHibernate. J'ai une classe dont j'ai besoin d'être mise en correspondance avec une table, mais elle a beaucoup de méthodes existantes qui ne sont pas virtuelles.

J'ai découvert que NHibernate pouvait charger le mappage avec succès même avec les méthodes non virtuelles présentes si je définissais le paramètre "lazy". attribuez à l'élément "class" du fichier de mappage la valeur "faux". Je me demande quel impact cela aura sur mon utilisation de NHibernate avec cette classe.

Je comprends le sens du chargement non paresseux sur les collections appartenant à un objet, mais je ne comprends pas bien ce que serait un chargement paresseux ou enthousiaste sur une classe. Cela signifie-t-il que toutes les collections appartenant à cet objet seraient chargées avec impatience? Ou cela signifie-t-il que NHibernate n'utilise plus de proxy dynamique à la place de la classe actuelle? Quelque chose d'autre?

Aussi, quel est le meilleur plan d'action ici? Est-il déconseillé de définir que paresseux = valeur fausse? Devrais-je créer une interface implémentée par la classe, puis la mapper à la table? Ou devrais-je simplement mordre la balle et marquer toutes les méthodes existantes sur la classe virtuelle?

Merci d'avance pour tout conseil!

Était-ce utile?

La solution

Je précise toujours lazy = false au niveau de la classe dans NHIbernate, car je ne souhaite pas que NHibernate m'oblige à déclarer que les propriétés doivent être virtuelles, si je ne le souhaite pas dans mon modèle de classe.

Lorsque vous spécifiez "lazy" lors du mappage de classe (par défaut), NHibernate utilise une classe "Dynamic Proxy" au moment de l'exécution. Ce proxy dynamique est une classe qui hérite de votre classe. Ensuite, pour autant que je sache, l'instance de la classe devrait être initialisée paresseusement / à la demande. Dans certains cas, cela devrait être meilleur pour la performance (du moins, c'est ce qu'on dit).

Mais, comme je n'aime pas ça, NHibernate me dit à quoi ma classe devrait ressembler, j'ai toujours spécifié lazy = false pour toutes mes classes et je n'ai pas encore eu de problèmes. :)

Autres conseils

L'utilisation du chargement différé est très efficace pour limiter le nombre d'objets. Cette fonctionnalité peut être extrêmement utile dans certaines situations. Par exemple, imaginons que vous ayez deux objets Utilisateur et Rôle et que tous les utilisateurs aient un ou plusieurs rôles. Lorsque vous chargez l'objet Utilisateur, vous souhaitez également charger tous ses rôles associés. Toutefois, lorsque vous chargez les rôles pour cet utilisateur, vous ne voudriez pas charger tous les utilisateurs associés à ce rôle, car cela pourrait entraîner le chargement de la base de données complète d'utilisateurs.

La définition de lazy = false signifie donc que toute la collection d’objets de la relation sera chargée lors du chargement de l’instance appelante. Dans certaines situations, cela est correct, bon et approprié. Dans d’autres, cela peut entraîner des problèmes de performances.

Rob, C'est juste une mauvaise conception. L'utilisateur aura la liste de type rôle mais le rôle n'aura pas la liste de type utilisateur. Utilisateur est une racine agrégée. Pour que tous les utilisateurs aient un rôle, définissez une méthode sur Utilisateur pour GetByRole (). Les traversées à 2 voies comme vous l'avez décrit font un modèle de domaine horrible. Google "références circulaires" et voir pourquoi il est mauvais.

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