NHibernate un-à-plusieurs problème de mappage
J'ai à la carte deux simple tableau avec une relation de clé étrangère. L'une des tables, Contact contenant des colonnes id (clé primaire de type int),nom, adresse et guid (nouvellement ajouté et n'est pas la clé primaire). L'autre est téléphone__numéro de contenant des colonnes id (clé primaire de type int), contact___id (clé étrangère de l'id dans la table contact) et téléphone__numéro de.
Le fichier de mappage de table Contact est comme ci-dessous :
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="OfflineDbSyncWithNHibernate" default-lazy="true" namespace="OfflineDbSyncWithNHibernate.Models">
<class name="Contact" table="Contact">
<id name="Id" column="Id" type="int">
<generator class="native" />
</id>
<property name="Name" column="name" type="string"/>
<property name="Address" column="address" type="string"/>
<property name="Guid" column="guid" type="string"/>
<set lazy="true" batch-size="6" table="phone_number" name="PhoneNumbers" fetch="join" inverse="false" cascade="all" >
<key foreign-key="FK_contact_phone_number" column="contact_id"/>
<one-to-many class="PhoneNumber" />
</set>
</class>
</hibernate-mapping>
Le fichier de mappage pour Phone_number table est la suivante :
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="OfflineDbSyncWithNHibernate" default-lazy="true" namespace="OfflineDbSyncWithNHibernate.Models">
<class name="PhoneNumber" table="phone_number">
<id name="Id" column="Id" type="int">
<generator class="native" />
</id>
<property name="ContactId" column="contact_id" />
<property name="Number" column="phone_number" />
</class>
</hibernate-mapping>
Le Contact et Numéro de classes sont :
namespace OfflineDbSyncWithNHibernate.Models
{
public class Contact
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual string Address { get; set; }
public virtual string Guid { get; set; }
public virtual PhoneNumbers PhoneNumbers { get; set; }
}
}
namespace OfflineDbSyncWithNHibernate.Models
{
public class PhoneNumber
{
public virtual int Id { get; set; }
public virtual int ContactId { get; set; }
public virtual string Number { get; set; }
}
}
namespace OfflineDbSyncWithNHibernate.Models
{
public class PhoneNumbers : List<PhoneNumber>
{
}
}
Lorsque je charge le contact et phone_numbers séparément, il fonctionne, mais après l'ajout de l'élément de jeu pour obtenir un un-à-plusieurs relation nhibernate donne une erreur :
NHibernate.MappingException: Invalide informations de mappage spécifié pour le type OfflineDbSyncWithNHibernate.Modèles.Contact, vérifiez votre fichier de mappage pour la propriété type de l'inadéquation
Je suis nouvelle dans nHibernate donc je ne sais pas si il y a une erreur dans l'élément de jeu ou je ne devrais même pas être à l'utiliser. Toute aide sera appréciée.
OriginalL'auteur Nazgul | 2009-03-14
Vous devez vous connecter pour publier un commentaire.
Juste rappelez-vous ce
Si vous souhaitez utiliser IList utilisation de la première règle que j'ai.e changer votre hbm.xml pour utiliser le Sac au lieu de Régler votre Phonenumbers classe doit hériter de IList pas la Liste, si vous souhaitez utiliser la Liste, vous devrez modifier votre fichier de mapping pour l'utilisation de la Liste au lieu de Set.
OriginalL'auteur Brijesh Mishra
Je pense que votre PhoneNumbers les besoins de la classe d'hériter d'un sous-type de
Iesi.Collections.ISet
. Je ne pense pas qu'il y est un "Ensemble" type fourni dans .NET par défaut. Voir hibernate FAQJe pense que le <liste> cartographie devrait fonctionner
Non, quand vous voulez une Liste, vous aurez à utiliser un <sac> cartographie, depuis <liste> représente une collection ordonnée si je ne me trompe pas. Toutefois, un sac vous permet d'avoir plusieurs instances d'un même type dans votre collection, et cela peut provoquer d'étranges choses que vous ne vous attendez pas
Ah oui, c'est vrai. J'ai oublié la commande avec la liste. J'ai l'habitude de l'utiliser juste le sac, je suppose.
Essayez de changer votre "set" pour "sac" dans la cartographie et de changer votre PhoneNumbers propriété de IList<Numéro de téléphone>. Vous ne pouvez pas besoin de l'PhoneNumbers classe.
OriginalL'auteur Andy White
Votre collection de type doit être une interface, parce que NHibernate fournira son propre type qui implémente cette interface lorsqu'un objet est récupéré à partir de la DB.
Si vous définissez votre collection comme
Alors je pense que cela va fonctionner.
Afin de mieux contrôler l'accès à votre collection, vous pouvez modifier vos coordonnées classe comme ceci:
Ensuite, vous devez vous assurer que votre mapping de la classe Contact, vous spécifiez que NHibernate devrait accéder au champ _phoneNumbers au lieu de la propriété, Numéro de téléphone:
OriginalL'auteur Frederik Gheysels