2010-11-17 4 views
0

J'ai un problème avec NHibernate. Ce que j'essaie de faire est très simple: J'ai deux classes. UserTicket et UserData. Un UsertTicket a quelque UserData et un UserData appartient à une UserTicket:La clé étrangère one-to-many de NHibernate est NULL

public class UserData{ 
    public virtual int Id { get; set; } 
    public virtual String PDF_Path { get; set; } 

} 

public class UserTicket 
{ 
    public virtual int Ticketnr { get; set; } 
    public virtual IList<UserData> UserData { get; set; } 
} 

Et voici le xml mappig:

<class name="UserTicket" table="UserTicket"> 
<id name="Ticketnr"> 
    <generator class="identity"/> 
</id> 
<bag name="UserData" inverse="true" cascade="all-delete-orphan" lazy="false"> 
    <key column="FK_Ticketnr" not-null="false"/> 
    <one-to-many class="UserData" /> 
</bag> 
</class> 




<class name="UserData" table="UserData"> 
    <id name="Id"> 
    <generator class="identity"/> 
    </id> 
    <property name="PDF_Path" /> 
</class> 

Quand je le lance, il fonctionne, mais la colonne FK_Ticketnr dans le DB-Table de UserData est toujours = NULL. Quelqu'un m'a dit que je dois faire un lien de retour de mon enfant (UserData) à la classe parent. Mais je ne peux pas comprendre comment le faire. Comment puis-je obtenir Hibernate pour écrire la valeur de la clé primaire (Ticketnr) de UserTicket dans FK_Ticketnr?

Merci à l'avance

Répondre

4

Supprimer inverse = "true" sur votre sac. Cela indique à NHibernate que la relation est gérée à partir du mappage UserData. Comme vous n'avez pas de référence arrière, elle n'est jamais conservée. L'autre option consiste à mettre une référence parent sur UserData, mais je ne le recommanderais pas si vous n'en avez pas besoin.

+0

Wow merci! C'est ce qu'il a fait. Vous avez vraiment sauvé ma journée. Avoir un bon. – Naugrim

2

L'alternative est la suivante ...

public class UserData 
{ 
    // Keep your other properties, add this one too... 
    public virtual UserTicket Ticket { get; set; } 
} 

Modifier votre fichier de mappage comme celui-ci ...

<class name="UserData" table="UserData"> 
    <id name="Id"> 
     <generator class="identity" /> 
    </id> 
    <property name="PDF_Path" /> 
    <many-to-one name="Ticket" column="FK_Ticketnr" /> 
</class> 

Gardez le inverse="true" sur le sac.

Si vous utilisez cette approche, vous devrez définir Ticket sur vos objets UserData lorsque vous les ajouterez au sac UserData. En d'autres termes, vous devez maintenir les deux côtés de la relation. Vous pouvez le faire manuellement ou vous pouvez essayer de l'automatiser un peu avec des méthodes ou des constructeurs.

Questions connexes