Родительское сопоставление NHibernate не создает дочерний внешний ключ - PullRequest
0 голосов
/ 17 декабря 2009

Я только учусь NHibernate. Я использовал примеры из документации и здесь в stackoverflow, но я должен что-то упустить.

У меня есть объект PARENT, в котором есть коллекция CHILD. ДЕТЯМ не имеет смысла без РОДИТЕЛЯ, поэтому в базе данных FK установлено значение NOT NULL. Реализация NHibernate от CHILD до PARENT работает нормально, хотя мне не нужно это направление отношений.

Вместо этого я попытался реализовать PARENT, которому принадлежат отношения, но я постоянно получаю сообщение об ошибке базы данных "Не удается вставить значение NULL в PARENT_ID" Ни идентификатор, ни сущность РОДИТЕЛЯ не сохраняются в РЕБЕНОКЕ при сохранении.

См. Пример кода ниже. Пожалуйста, сообщите.

Файлы классов

public class PARENT {
   private readonly IList<CHILD> _children = new List<CHILD>();
   public virtual Id { get; set; }
   public virtual void AddChild(CHILD child) {
      _children.add(child);
   }
}
public class CHILD {
   public virtual Id { get; set; }
}

Отображения

<class name="PARENT" table="Parent">
  <cache usage="read-write"/>

  <id name="Id" column="Id" unsaved-value="0" >
    <generator class="identity" />
  </id>

  <bag name="Children" access="field.camelcase-underscore" cascade="all-delete-orphan">
    <key column="ParentId"/>
    <one-to-many class="CHILD"/>
  </bag>

</class>
<class name="CHILD" table="Child">
  <cache usage="read-write"/>

  <id name="Id" column="Id" unsaved-value="0" >
    <generator class="identity"/>
  </id>

</class>

Ответы [ 2 ]

2 голосов
/ 17 декабря 2009

Вы должны определить обе стороны отношений в вашем отображении и объектной модели. Затем вы объявляете один как inverse="true" в отображении. Так что-то вроде этого должно работать:

Файлы классов

public class PARENT {
   private readonly IList<CHILD> _children = new List<CHILD>();
   public virtual Id { get; set; }
   public virtual void AddChild(CHILD child) {
      _children.add(child);
   }
}
public class CHILD {
   public virtual PARENT Parent { get; set; }
   public virtual Id { get; set; }
}

Отображения

<class name="PARENT" table="Parent">
  <cache usage="read-write"/>

  <id name="Id" column="Id" unsaved-value="0" >
    <generator class="identity" />
  </id>

  <bag name="Children" access="field.camelcase-underscore"
     cascade="all-delete-orphan" inverse="true">
    <key column="ParentId"/>
    <one-to-many class="CHILD"/>
  </bag>

</class>
<class name="CHILD" table="Child">
  <cache usage="read-write"/>

  <id name="Id" column="Id" unsaved-value="0" >
    <generator class="identity"/>
  </id>
  <many-to-one name="Parent" class="PARENT" column="ParentId" />

</class>

И вы можете изменить свой метод AddChild следующим образом:

public virtual void AddChild(CHILD child) {
   _children.add(child);
   child.Parent = this;
}
0 голосов
/ 17 декабря 2009

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

Я думаю, что NHibernate сначала сохраняет ребенка. Затем он хранит родителя. Поскольку вам нужны идентификаторы, у него нет первичного ключа для родительского элемента до его вставки в базу данных. Затем необходимо обновить ребенка потом.

Попробуйте другой генератор идентификаторов. hilo рекомендуется. Это также быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...