NHibernate de mise en correspondance un-à-un (ou zéro)
NHibernatians!
J'ai une table [dbo].[Wibble] et une autre table [dbo].[WibbleExtended].
[Wibble] est la table principale et [WibbleExtended] est une option de la table où certains autres champs sont stockés. Il y a beaucoup moins d'entrées dans le [WibbleExtended] table que la principale [Wibble] table. Je pense que cela a été fait retour dans la journée à guérir certains problèmes d'espace (Wibble a de nombreuses lignes et WibbleExtened a beaucoup de colonnes).
L'ID de chaque tableau est le même et provient d'une source externe.
I. e.
[dbo].[Wibble].[WibbleId]
et
[dbo].[WibbleExtended].[WibbleId]
sont identiques et comment les deux tableaux se rapportent.
N. B. je ne peux pas modifier le schéma. Je suis de la chaussure horning ce sur un système d'héritage que je n'ai presque aucun contrôle sur.
Recherche autour il semble que l'un-à-un les mappages sont problématiques et la vigueur de la sagesse consiste à utiliser deux plusieurs-à-un les mappages.
Mon mappages actuellement sont:
<class name="Wibble" table="Wibble" >
<id name="Id" column="WibbleId" type="Int32">
<generator class="assigned"/>
</id>
<many-to-one name="WibbleExtended" class="WibbleExtended" column="WibbleId" not-null="false" cascade="all"/>
</class>
Et
<class name="WibbleExtended" table="WibbleExtended" >
<id name="Id" column="WibbleId" type="Int32">
<generator class="assigned" />
</id>
<many-to-one name="Wibble" class="Wibble" column="WibbleId" not-null="true" />
</class>
Le problème avec ceci est que j'ai des erreurs comme
System.IndexOutOfRangeException: Invalid index n for this SqlParameterCollection with Count=n.
J'ai regardé autour et ce ne ressembler à la bonne stratégie, c'est juste de la chute à la dernière haie.
Est le problème de l'id du générateur? Autre aspect de la cartographie?
Gratuit mince tarte pour la réponse correcte.
EDIT: Ok - voici ce que j'ai fait pour résoudre ce via @James Gregory.
- Déplacé l'appareil de tests à partir de la WibbleExtended les tests à la Wibble de la classe de test et faites les modifications nécessaires.
- Ajouté ce qui suit à l'Wibble.hbm.xml
<join table="WibbleExtended" optional="true"> <key column="WibbleId"/> <property name="Blah1" column="Blah1" type="String" length="2000" not-null="false" /> <property name="Blah2" column="Blah2" type="String" length="1000" not-null="false" /> </join>
- Ajouté les propriétés correspondantes à la Wibble POCO.
- Supprimé tous les code relatives à la WibbleExtended.
- L'exécution des tests, tous les passés, en soute. Construire passé. Est allé pour un noël à la bière (donc il a été une couple de jours avant j'ai mis à jour ce! :-))
OriginalL'auteur Iain Holder | 2008-12-23
Vous devez vous connecter pour publier un commentaire.
Avez-vous considéré l'utilisation de la Rejoignez élément qui a été introduit dans NHibernate 2.0? Cet élément vous permet de joindre plusieurs tables pour former une seule entité; cette relation peut aussi être une option.
A parfaitement fonctionné! Merci James.
OriginalL'auteur James Gregory
L'erreur que vous obtenez:
est due à deux propriétés mappé à la même colonne. Utilisez insert=false et
mise à jour=false dans l'un des deux.
référence http://groups.google.com/group/nhusers/browse_thread/thread/84830b1257efd219
OriginalL'auteur Jalal El-Shaer
Consultez ce lien: http://www.hibernate.org/hib_docs/nhibernate/html/inheritance.html
La "rejoint la sous-classe" de la cartographie, en particulier, je pense que vous le trouverez utile (en supposant que WibbleExtended hérite de Wibble).
OriginalL'auteur AlexCuse