NHibernate удалить элемент в коллекции не работает - PullRequest
4 голосов
/ 08 августа 2009

Я новичок в мире NHibernate.

Почему этот код работает, удаляя территорию из коллекции:

Country country;

using (IUnitOfWork unit = UnitOfWork.Start())
{
    country = new Country();
    country.Name = "My country";

    Territory territory = new Territory();
    country.Territories.Add(territory);
    country.Territories.Remove(territory);
}

И этот код не работает:

Country country;

using (IUnitOfWork unit = UnitOfWork.Start())
{
    country = _countries.GetById(1);

    Territory territory = new Territory();
    country.Territories.Add(territory);
    country.Territories.Remove(territory);
}

Во втором фрагменте кода _countries - это хранилище. Идентификатор страны 1 существует в базе данных. Территория добавлена, но не удалена ...

Вот отображение:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="iCible.Artishows.Framework.ObjectDefinition"
                   namespace="iCible.Artishows.Framework.ObjectDefinition" >
  <class name="Country" >
    <id name="ID">
      <generator class="identity"/>
    </id>
    <property name="Name" />
    <set name="Territories" cascade="all-delete-orphan" inverse="true" order-by="Name" sort="iCible.Artishows.Framework.ObjectDefinition.TerritoryComparer">
      <key column="COUNTRYID"/>
      <one-to-many class="Territory"/>
    </set>
    <property name="CreationDate" />
    <property name="EditionDate" />    
    <many-to-one class="User" name="CreationUser"/>
    <many-to-one class="User" name="EditionUser"/>
  </class>
</hibernate-mapping>

Что мне здесь не хватает?

Ответы [ 2 ]

6 голосов
/ 08 августа 2009

Мне не совсем понятна причина, но я думаю, что это может быть из-за части inverse="true". Смысл этого, я думаю, в том, что это означает, что отношения управляются другой стороной, то есть с территории в страну, поэтому удаление элемента из Country.Territories может работать не совсем так, как вы ожидаете.

Как выглядит ваше картографирование территории? - Я предполагаю, что в нем есть ссылка «один на один» на родителя страны?

Сказав это, мои знания NHibernate по-прежнему в основном находятся на уровне "возиться с настройками, пока они не будут работать так, как я этого хочу". Но я уверен, что вы сможете заставить его работать, изменив атрибут inverse и / или параметр cascade (т.е. попробуйте изменить его на «все»).

Что бы это ни стоило, большинство наших отображений, которые используют один-ко-многим, выглядят так, и я думаю, что мы обычно удаляем вещи так же, как вы показали:

<class name="Parent">
  <id name="ParentID">
  ...
  <map name="ChildCollection" cascade="all" inverse="true">
</class>

<class name="Child">
  ...
  <many-to-one name="Parent" column="ParentID" not-null="true">
</class>
2 голосов
/ 08 августа 2009

Я боролся с похожей, но другой проблемой NHibernate, когда детей не удаляли. Ответ на мой вопрос может дать вам некоторое представление, даже если это не совсем та же проблема.

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