NHibernate删除集合中的项目不起作用

时间:2009-08-08 16:40:35

标签: c# nhibernate collections

我是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是一个存储库。国家/地区ID 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 个答案:

答案 0 :(得分:6)

我不清楚原因,但我认为这可能是因为inverse="true"部分。我认为,这意味着它意味着关系由另一方管理,即从领土到国家,因此从Country.Territories删除项目可能无法完全按照您的预期运作。< / p>

您的Territory映射是什么样的? - 我假设它对Country Parent有多对一的引用?

话虽如此,我的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>

答案 1 :(得分:2)

我遇到了类似但不同的NHibernate问题,孩子们没有被删除。 my question的答案可能会给你一些见解,即使它不是完全相同的问题。