2009-05-19 7 views
4

Ma structure de base de données ressemble à ceci:NHibernate Carte many-to-many se joindre à la table

Person 
    Id 
    Name 
    FieldA 
    FieldB 

Phone 
    Id 
    Number 

PersonPhone 
    PhoneId 
    PersonId 
    IsDefault 

mappings Mon NHibernate pour la personne et les objets de téléphone sont tout droit, c'est le PersonPhone j'avoir difficile avec. Je veux avoir une collection d'objets PersonPhone comme une propriété de Person qui me permettra d'avoir le numéro de téléphone d'une personne et de savoir quel est le numéro de téléphone "par défaut" ou principal d'une personne.

idéalement Id comme mon objet PersonPhone à ressembler à ceci:

public class PersonPhone 
{ 
    public virtual Person Person { get; set; } 
    public virtual Phone Phone { get; set; } 
    public virtual bool IsDefault { get; set; } 
} 

jusqu'à présent ma cartographie NHibernate pour ce tableau se présente comme suit:

<class name="PersonPhone" table="PersonPhone"> 
    <composite-id> 
     <key-property name="Person" column="PersonId" /> 
     <key-property name="Phone" column="PhoneId" /> 
    </composite-id> 
    <property name="IsDefault" column="IsDefault"/> 
</class> 

mais quand NHibernate compile mes correspondances que je reçois une erreur indiquant:

Impossible de compiler le document de mappage: MyApp.Entities.PersonPhone.hbm.xml. NHibernate.MappingException: Impossible de déterminer le type de: MyApp.Entities.Person, MyApp.Entities, Version = 1.0.0.0, Culture = neutre, PublicKeyToken = null, pour les colonnes: NHibernate.Mapping.Column (PersonId)

des idées sur la façon dont cela devrait être cartographié?

Répondre

7

La réponse est d'utiliser l'élément dans votre clé composite plutôt que la clé propriété

<class name="PersonPhone" table="PersonPhone"> 
    <composite-id> 
     <key-many-to-one name="Person" column="PersonId"></key-many-to-one> 
     <key-many-to-one name="Phone" column="PhoneId"></key-many-to-one> 
    </composite-id> 
    <property name="IsDefault" column="IsDefault"/> 
</class> 
+4

Si quelqu'un pourrait traduire cela FluenNHibernate ... – sydneyos

3

Je pense qu'il est plus approprié de considérer plusieurs à plusieurs entre Téléphone et entités Peron et se débarrasser de l'entité PersonPhone.

+1

sans l'entité PersonPhone je n'aurais aucun moyen de représenter la Propriété IsDefault. –

+0

Je ne sais pas Si ce serait correct d'avoir un mappage plusieurs-à-plusieurs et une propriété supplémentaire Person.DefaultPhone. Le point, je n'aime pas l'idée de PersonPhone, je tente habituellement de simuler/capturer des entités en direct dans mon design. –

3

Pour configurer le même mappage avec Fluent NHibernate, faites ceci:

public class PersonPhoneMap : ClassMap<PersonPhone> 
{ 
    public PersonPhoneMap() 
    { 
     CompositeId() 
      .KeyReference(p => m.Person) 
      .KeyReference(p => m.Phone); 

     References(p => p.Person) 
      .Column("PersonID"); 
     References(m => m.Phone) 
      .Column("PhoneID"); 
     Map(p => p.IsDefault) 
      .Column("IsDefault"); 
    } 
} 
Questions connexes