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

vIc*_*erg 4 c# collections nhibernate

我是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);
}
Run Code Online (Sandbox Code Playgroud)

这段代码不起作用:

Country country;

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

    Territory territory = new Territory();
    country.Territories.Add(territory);
    country.Territories.Remove(territory);
}
Run Code Online (Sandbox Code Playgroud)

在第二个代码片段中,_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>
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?

Gav*_*vin 6

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

您的Territory映射是什么样的? - 我认为它对Country父母有多对一的引用?

话虽如此,我的NHibernate知识仍然大部分处于"摆弄设置,直到它像我想要的那样工作".但我很确定你能够通过调整inverse属性和/或cascade选项(即尝试将其更改为"all")来使其工作.

对于它的价值,大多数使用一对多的映射都是这样的,我认为我们通常会以与您显示的相同的方式删除内容:

<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>
Run Code Online (Sandbox Code Playgroud)