Удаление деталей мастера nHibernate - PullRequest
3 голосов
/ 23 декабря 2008

У меня настроено отношение Master Detail. Файл hbm находится ниже. Когда я запускаю некоторый код, подобный этому

Favourite favourite = favourites.Find(f => f.Id== id);
user.Favourites.Remove(favourite);
m_UserRepository.Save(ref user);

Я получаю сообщение об ошибке

NHibernate.Exceptions.GenericADOException: не удалось удалить строки коллекции: [Model.Entities.User.Favourites # 249] [SQL: SQL недоступен] ---> System.Data.SqlClient.SqlException: невозможно вставить значение NULL в столбце «UserId», таблица «BE.Favourite»; столбец не допускает пустых значений. ОБНОВЛЕНИЕ не удается.

Любые предложения о том, что это значит, пожалуйста, помогите.

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Model.Entities" schema="BE" assembly="Model" default-lazy="false">
  <class name="Model.Entities.User, Model" table="Users" >
    <id name="UserId" column="UserId" type="int" unsaved-value="0">
      <generator class="native" />
    </id>
    <property name="UserName" column="UserName" type="string" />

    <bag name="Favourites" cascade="all" lazy="true">
      <key column="UserId"/>
      <one-to-many class="Model.Entities.Favourite, Model"/>
    </bag>

  </class>
</hibernate-mapping>

Ответы [ 3 ]

6 голосов
/ 23 декабря 2008

Вы пробовали установить inverse="true" на своей сумке?

6 голосов
/ 05 января 2009

В этом случае вам действительно нужны отношения «многие ко многим»:

<class name="User">
  <id name="Id">
    <generator class="native">
      <param name="sequence">object_sequence</param>
    </generator>
  </id>
  <version name="Version" />
  <property name="Name" />
  <set name="Roles" table="User_Favourite">
    <key column="UserId"/>
    <many-to-many column="FavouriteId" class="Favourite"/>
  </set>
</class>

И то же самое с другой стороны: (* обратите внимание на обратное = "true")

<class name="Favourite">
  <id name="Id">
    <generator class="native">
      <param name="sequence">object_sequence</param>
    </generator>
  </id>
  <version name="Version" />
  <property name="RoleName" />
  <set name="Users" table="User_Favourite" inverse="true">
    <key column="FavouriteId"/>
    <many-to-many column="UserId" class="User"/>
  </set>
</class>

Из документации NHibernate 2.0 :

Очень важное примечание : Если столбец <key> ассоциации <one-to-many> объявлен NOT NULL, NHibernate может вызвать нарушения ограничений при создании или обновлении ассоциации. Чтобы предотвратить эту проблему, необходимо использовать двунаправленную ассоциацию с многозначным концом (набором или сумкой), помеченным как inverse="true". См. Обсуждение двунаправленных ассоциаций далее в этой главе.

Наконец, я не уверен, действительно ли вы хотите использовать сумку здесь. Один пользователь может иметь одного и того же фаворита два или более раз?

P.S .: Также обратите внимание, что lazy = "true" является поведением по умолчанию, начиная с NHibernate 1.2.

1 голос
/ 23 декабря 2008

попробуйте изменить правило каскада на:

<bag name="Favourites" cascade="all,delete-orphan" lazy="true">
  <key column="UserId" not-null="true"/>
  <one-to-many class="Model.Entities.Favourite, Model"/>
</bag>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...