Внешний ключ NHibernate «один ко многим» равен NULL

У меня проблема с NHibernate. То, что я пытаюсь сделать, очень просто: у меня есть два класса. Пользовательский билет и данные пользователя. Пользовательский билет имеет некоторые пользовательские данные, а пользовательские данные принадлежат одному пользовательскому билету:

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

А вот 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>

Когда я запускаю его, он работает, но столбец FK_Ticketnr в DB-таблице пользовательских данных всегда = NULL. Кто-то сказал мне, что я должен сделать обратную ссылку от моего ребенка (UserData) к родительскому классу. Но я не могу понять, как это сделать. Как заставить Hibernate записать значение первичного ключа (Ticketnr) UserTicket в FK_Ticketnr?

заранее спасибо


person Naugrim    schedule 17.11.2010    source источник


Ответы (2)


Удалите inverse="true" с сумки. Это говорит NHibernate, что отношения управляются из сопоставления UserData. Поскольку у вас нет обратной ссылки, она никогда не сохраняется. Другой вариант — поместить родительскую ссылку на UserData, но я бы не рекомендовал его, если он вам не нужен.

person James Kovacs    schedule 17.11.2010
comment
Вау, спасибо! Это сделало это. Вы действительно спасли мой день. Приятного аппетита. - person Naugrim; 17.11.2010

Альтернатива следующая...

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" на сумке.

Если вы выберете этот подход, вам нужно будет установить Ticket для ваших объектов UserData, когда вы добавите их в сумку UserData. Другими словами, вам нужно поддерживать обе стороны отношений. Вы можете сделать это вручную или попытаться немного автоматизировать с помощью методов или конструкторов.

person Adam Boddington    schedule 17.11.2010