我有一个简单的父/子表。合同是父表。每份合约可以有多个单位。
这是我的C#类定义(简化):
public class Contract : EntityWithIntID
{
public virtual string ContractNum { get; set; }
public virtual IList<Unit> Units { get; protected set; }
public virtual int NumberOfUnits
{
get { return Units.Count; }
}
}
public class Unit : EntityWithIntID
{
<various Unit physical data fields>
}
我正在使用FluentNHibernate和AutoMapping。这是我的AutoMapping类:
public static AutoPersistenceModel GetMappings()
{
AutoPersistenceModel returnModel = AutoMap.AssemblyOf<Contract>()
.IgnoreBase(typeof(EntityWithIntID))
.Where(type => type.BaseType == typeof(EntityWithIntID) )
.Conventions.Add(typeof(PluralTableNamesConvention))
.Conventions.Add(typeof(CascadeAllConvention))
.Override<Contract>(map =>map.HasMany(cont =>cont.Units).Inverse())
.Override<Contract>(map=>map.Map(cont => cont.ContractNum).Not.Nullable().Unique())
;
return returnModel;
}
}
以下是Fluent生成的HBM.XML文件:
(对于Units表):
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="property" auto-import="true" default-cascade="none" default-lazy="true">
<class xmlns="urn:nhibernate-mapping-2.2" name="InterfaceDB.Unit, InterfaceDB, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="Units">
<id name="Id" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="Id" />
<generator class="hilo">
<param name="max_lo">10</param>
</generator>
</id>
<!-- physical data property elements removed for brevity -->
</class>
</hibernate-mapping>
(和合同表):
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="property" auto-import="true" default-cascade="none" default-lazy="true">
<class xmlns="urn:nhibernate-mapping-2.2" name="InterfaceDB.Contract, InterfaceDB, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="Contracts">
<id name="Id" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="Id" />
<generator class="hilo">
<param name="max_lo">10</param>
</generator>
</id>
<property name="ContractNum" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="ContractNum" not-null="true" unique="true" />
</property>
<bag cascade="all" inverse="true" name="Units">
<key>
<column name="Contract_id" />
</key>
<one-to-many class="InterfaceDB.Unit, InterfaceDB, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</bag>
</class>
</hibernate-mapping>
对于我的单元测试目的,我在每个存储库中都有一个“Clear()”方法,因此我可以从一个已知的空数据库开始。它只是做了一个
Session.Delete("from Unit");
后跟Debug.Assert(Repository.GetCount()== 0);
我的问题是,当我执行一个UnitsRepository.Clear()时,我得到一个NHibernate.ObjectDeleteException:删除的对象将通过级联重新保存(从关联中删除已删除的对象)
我用谷歌搜索了这个错误,并发现了一些关于它的文章,但没有任何建议似乎有效。我在父映射上添加了“.Inverse()”。我已经尝试将级联从“All”更改为“SaveUpdate”(它从未设置为“AllDeleteOrphans”,其中一些帖子引用了问题。)我正在清除所有存储库,我尝试将整个存储器包装在一个交易。我尝试在Session.Delete之后添加一个flush。我尝试先清除父存储库,然后清除子存储库。什么都没有摆脱错误。
任何帮助都将不胜感激。
答案 0 :(得分:0)
您没有在映射中显示它,但可能是Unit有一个对其父合同的引用。要删除单位,您必须将对合约的引用设置为null,并根据您的映射将其从Contract的Units集合中删除。