Внешний ключ NHibernate один-ко-многим равен NULL - PullRequest
0 голосов
/ 17 ноября 2010

У меня проблема с 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>

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

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

Ответы [ 2 ]

4 голосов
/ 17 ноября 2010

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

2 голосов
/ 18 ноября 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.Другими словами, вам нужно поддерживать обе стороны отношений.Вы можете сделать это вручную или немного автоматизировать с помощью методов или конструкторов.

...