我有一个自引用对象Cycle:
public class Cycle
{
public Cycle()
{
ParentCycle = this;
ChildCycles = new List<Cycle>{this};
}
public virtual Guid Id { get; set; }
public virtual Cycle ParentCycle { get; set; }
public virtual IList<Cycle> ChildCycles { get; set; }
public virtual int Version { get; set; }
}
使用以下映射:
public class CycleMap : ClassMap<Cycle>
{
public CycleMap()
{
Table("Cycle");
Id(x => x.Id).Column("CycleID");
References(x => x.ParentCycle).Column("ParentCycleID").Not.Nullable();
HasMany(x => x.ChildCycles).KeyColumn("ParentCycleID").Cascade.AllDeleteOrphan().Inverse();
Version(x => x.Version);
}
}
我运行以下测试代码:
var parentCycle = new Cycle();
session.Save(parentCycle);
session.Flush();
session.Delete(parentCycle);
session.Flush();
循环的创建有效,但当我尝试删除循环时,我有两个问题:
我想知道是否有其他人有同样的问题,理想的解决方案是停止更新,因为这是不必要的。但我似乎无法做到这一点。
我在GitHub
上提供了测试代码答案 0 :(得分:0)
设置称为 inverse="true"
public CycleMap()
{
...
HasMany(x => x.ChildCycles)
.KeyColumn("ParentCycleID")
// the setting, instructing NHibernate that other end will care...
.Inverse()
.Cascade.AllDeleteOrphan();
...
关键是,如果NHibernate知道,另一端(反向的)正在关注这种关系,那就不必发布了
inverse="true"
的深层描述可以在这里找到(我真的建议通读,它是非常结构化的概述,对NHibernate仍然有效):
inverse = “true”
example and explanation by mkyong