我是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>
我在这里缺少什么?
答案 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的答案可能会给你一些见解,即使它不是完全相同的问题。