Question

J'ai un scénario que je veux ajouter quelques propriétés standard à mes entités. Ce qui signifie que je vais avoir par exemple 1 int et 2 propriétés de chaîne appliquées à toutes les entités concernées. J'ai plus de 100 fichiers de mappage et la plupart, mais tous ne seront pas hôtes à ces nouvelles propriétés. Dans les classes facile de définir ce; dans les applications mais je l'ai trouvé aucune référence autre que la création d'un service public ou xslt et l'application que ( Comment définir réutilisables <> générateur éléments de mise en veille prolongée cartographie ).

Cependant, je veux être en mesure d'ajouter / modifier / supprimer des propriétés de ce mapping « standard ».

thx pour des réponses

Edit1: un exemple de la mise en correspondance que je veux ajouter

<property name="TimeOfEdit" column="TimeOfEdit" type="DateTime" not-null="true"/>
<many-to-one name="EditedBy" column="FK_EditedBy" cascade="save-update" not-null="true" />

Edit2: J'ai enlevé la solution retenue, car avec NH 2.1.1 Les entités XML ne fonctionnent pas (NH-1236) et NH jetteront un « DTD est interdite dans ce document XML »

Était-ce utile?

La solution 5

Il semble que le seul pour ce faire, est d'utiliser la cartographie dynamique ( http://ayende.com/Blog/archive/2008/05/01/Dynamic-Mapping-with-NHibernate.aspx )

en tant que tel que j'ai déjà défini une interface que mes entités utiliseront pour les nouvelles propriétés (permet de dire IAuditable) juste une question d'exécuter le code approprié à l'initialisation de session NH

Configuration cfg = new Configuration() Mappings mappings = cfg.CreateMappings(); 
foreach (var persistentClass in mappings.Classes) 
{ 
   if (persistentClass.MappedClass is IAuditable)
   {
     ...
   }
}

et

cfg.BuildSessionFactory();

pour avoir câblé et prêt à être utilisé pour environ 85 cours l'impact sur les performances est négligeable

Autres conseils

Cela dépend de la façon dont ces propriétés sont mises en œuvre dans vos classes.

S'ils sont tous définis dans un classe de base ou de l'interface , vous pouvez les mapper une fois dans la classe de base ou de l'interface, et d'en tirer à l'aide union-subclass. Il y a quelques limites. Lire ce chapitre dans la documentation NHibernate à ce sujet.

Si vous décidez de les mettre ensemble dans une classe, vous pouvez les associer comme type d'utilisateur . Ce sera similaire à un composant, mais vous pouvez spécifier certaines choses comme les noms de type, les longueurs et les autres dans le type d'utilisateur. Vous devez toujours indiquer le nom de chaque colonne.

Il y a une autre option: vous pouvez utiliser entités XML . Ceci est une caractéristique assez primitive de XML qui est pris en charge par NHibernate. Lire ce chapitre dans la documentation de référence NH où il est mentionné.

Création d'un générateur de code spécial pour votre cas particulier est votre seule option.

Option 1:
-Définir ces 3 propriétés dans une classe de base

-ont vos entités héritent de cette base

-set up 'une table par hiérarchie de classe'

Option 2:

-Définir ces 3 propriétés en tant que composant.

Tu peut avoir le mappage pour ces 3 propriétés dans un fichier qui est réutilisée.

Vous pouvez jeter un oeil à fluentNHibernate , elle simplifie grandement les travaux de cartographie pour vous. Avec Avec la cartographie automatique, vous pouvez seulement besoin d'une classe de base abstraite pour définir ces propriétés.

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