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)
我在这里错过了什么?
我不清楚原因,但我认为可能是因为这个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)