2010-11-10 4 views
1

J'ai deux classes:problème avec l'association many-to-one dans NHibernate

public class Article 
{ 
    private ISet<IdentNumber> identNumbers = new HashedSet<IdentNumber>(); 

    public virtual int ArticleId { get; set; } 

    public virtual string ArticleNumber { get; set; } 

    private virtual ISet<IdentNumber> IdentNumbers 

    public virtual void AddIdentNumber(IdentNumber identNumber) 
    { 
     if (identNumber.Article != null && identNumber.Article.identNumbers != null) 
     { 
      identNumber.Article.identNumbers.Remove(identNumber); 
     } 

     identNumber.Article = this; 
     this.IdentNumbers.Add(identNumber); 
    } 
} 

public class IdentNumber 
{ 
    public virtual int Number { get; set; } 

    public virtual int ArticleId { get; set; } 

    public virtual Article Article { get; set; } 

    public override bool Equals(object obj) 
    { 
     if (obj == null) 
     { 
      return false; 
     } 

     var x = obj as IdentNumber; 
     if (x == null) 
     { 
      return false; 
     } 

     return this.Number == x.Number && this.ArticleId == x.ArticleId; 
    } 

    public override int GetHashCode() 
    { 
     return (this.ArticleId + "|" + this.Number).GetHashCode(); 
    } 
} 

Ces objets doivent être mis en correspondance avec deux tables et articles IdentNumbers dans une base de données existante. Artikles a ArtikleId (PK, int, not null) en tant que colonne d'identité. IdentNumbers a un PK composite. Number (PK, int, not null) et ArticleId (PK, FK, int, non null).

Ce sont les fichiers de mappage j'ai obtenu jusqu'à présent:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="Article" table="Articles"> 
    <id name="ArticleId" unsaved-value="0"> 
     <generator class="native" /> 
    </id> 
    <property name="ArticleNumber" /> 
    <set name="IdentNumbers" table="IdentNumbers"> 
     <key column="ArticleId" /> 
     <many-to-many unique="true" class="IdentNumber" /> 
    </set> 
    </class> 
</hibernate-mapping> 

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="IdentNumber" table="IdentNumbers"> 
    <id name="ArticleId" column="ArticleId"> 
     <generator class="foreign"> 
     <param name="property">ArticleId</param> 
     </generator> 
    </id> 
    <property name="Number" /> 
    </class> 
</hibernate-mapping> 

Ce que je veux aller au travail est quelque chose comme ceci:

var article = new Article { ArticleNumber = "9876" }; 
var identNumber = new IdentNumber { Number = 1234 }; 
article.AddIdentNumber(identNumber); 

session.Save(article); 

Je ne peux pas pour le live de me faire ce pk composite avec une partie de celui-ci étant une clé étrangère pour travailler.

Merci pour l'aide.

Edit:

Merci à Falcon i obtenu les correspondances droite.

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="Article" table="Articles"> 
    <id name="ArticleId" unsaved-value="0"> 
     <generator class="native" /> 
    </id> 
    <property name="ArticleNumber" /> 
    <set name="IdentNumbers" table="IdentNumbers" cascade="all"> 
     <key column="ArticleId" /> 
     <one-to-many class="IdentNumber" /> 
    </set> 
    </class> 
</hibernate-mapping> 

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="IdentNumber" table="IdentNumbers"> 
    <composite-id> 
     <key-many-to-one name="Article" column="ArticleId"/> 
     <key-property name="Number" /> 
    </composite-id> 
    </class> 
</hibernate-mapping> 
+0

Votre correspondance ne correspond pas à votre description - voir le http://www.nhforge.org/doc/nh/fr/index.html#mapping-declaration-compositeid pour un exemple de ce que je pense que vous êtes essayer de faire –

+0

Regardez session.load() – UpTheCreek

+0

J'ai essayé d'utiliser un ID composé avec l'article dans la clé-plusieurs-à-un, mais je ne peux pas spécifier le générateur class = "foreign" sur ce point. – Cypher1312

Répondre

1

Vous n'avez pas besoin de l'articleID! Il suffit de mapper la référence à la classe Article dans le cadre de votre PK! Lorsque vous définissez l'article du numéro d'identité, vous répétez déjà cette partie de la clé.

+0

Merci, ça l'a fait. J'ai édité mon post avec les nouveaux mappings. – Cypher1312