NHibernate一对多外键为空

NHibernate一对多外键为空,nhibernate,null,foreign-keys,one-to-many,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

我对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; }
}
公共类用户数据{
公共虚拟整数Id{get;set;}
公共虚拟字符串PDF_路径{get;set;}
}
公共类用户票
{
公共虚拟int Ticketnr{get;set;}
公共虚拟IList用户数据{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表中的FK_Ticketnr列总是=NULL。 有人告诉我必须从我的孩子(UserData)到父类建立一个反向链接。但我不知道怎么做。如何让Hibernate将UserTicket的主键(Ticketnr)的值写入FK_Ticketnr


提前感谢

取下您包上的Reverse=“true”。这就告诉NHibernate,关系是通过UserData映射来管理的。因为没有反向引用,所以它永远不会持久化。另一个选项是在UserData上放置一个父引用,但如果您不需要它,我不建议您这样做。

在您的包上删除reverse=“true”。这就告诉NHibernate,关系是通过UserData映射来管理的。因为没有反向引用,所以它永远不会持久化。另一个选项是在UserData上放置一个父引用,但如果您不需要它,我不建议您使用它。

另一种选择是以下

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包时,需要在其上设置票证。换句话说,你需要维持关系的双方。您可以手动执行此操作,也可以尝试使用方法或构造函数将其自动化一点。

替代方法如下

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包时,需要在其上设置票证。换句话说,你需要维持关系的双方。您可以手动执行此操作,也可以尝试使用方法或构造函数将其自动化一点。

哇,谢谢!成功了。你真的救了我一天。祝你过得愉快。哇,谢谢!成功了。你真的救了我一天。祝你过得愉快。