NHibernate一对多外键是NULL

时间:2010-11-17 18:24:12

标签: nhibernate null foreign-keys one-to-many

我有NHibernate的问题。我想要的是非常简单的: 我有两个课程。 UserTicket和UserData。 UsertTicket有一些UserData,UserData属于一个UserTicket:

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; }
}

这里是mappig xml:

<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>

当我运行它时,它可以工作,但是UserData的DB-Table中的列FK_Ticketnr总是= NULL。 有人告诉我,我必须从我的孩子(UserData)到父类进行反向链接。但我无法弄清楚如何做到这一点。如何让Hibernate将UserTicket的Primary-Key(Ticketnr)的值写入FK_Ticketnr?

提前致谢

2 个答案:

答案 0 :(得分:4)

在你的包上删除inverse =“true”。这告诉NHibernate该关系是从UserData映射管理的。由于您没有后向引用,因此永远不会持久化。另一个选项是在UserData上放置一个父引用,但如果你不需要它我就不推荐它。

答案 1 :(得分:2)

替代方案如下......

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

像这样修改您的映射文件......

<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>

inverse="true"放在行李上。

如果您采用这种方法,则在将UserData对象添加到UserData包时,需要在其上设置Ticket。换句话说,你需要保持关系的两面。您可以手动执行此操作,也可以尝试使用方法或构造函数自动执行此操作。