C# Nhibernate在删除之前阻止更新

C# Nhibernate在删除之前阻止更新,c#,nhibernate,fluent-nhibernate,self-reference,C#,Nhibernate,Fluent Nhibernate,Self Reference,我有一个自引用对象循环: 公共类循环 { 公共自行车() { ParentCycle=this; ChildCycles=新列表{this}; } 公共虚拟Guid Id{get;set;} 公共虚拟循环ParentCycle{get;set;} 公共虚拟IList子周期{get;set;} 公共虚拟整数版本{get;set;} } 使用以下映射: 公共类循环映射:类映射 { 公共循环映射() { 表(“周期”); Id(x=>x.Id).Column(“CycleID”); 引用(x=>x.

我有一个自引用对象循环:

公共类循环
{
公共自行车()
{
ParentCycle=this;
ChildCycles=新列表{this};
}
公共虚拟Guid Id{get;set;}
公共虚拟循环ParentCycle{get;set;}
公共虚拟IList子周期{get;set;}
公共虚拟整数版本{get;set;}
}
使用以下映射:

公共类循环映射:类映射
{
公共循环映射()
{
表(“周期”);
Id(x=>x.Id).Column(“CycleID”);
引用(x=>x.ParentCycle).Column(“ParentCycleID”).Not.Nullable();
HasMany(x=>x.ChildCycles).KeyColumn(“ParentCycleID”).Cascade.AllDeleteOrphan().Inverse();
版本(x=>x.Version);
}
}
我运行以下测试代码:

var parentCycle=new Cycle();
session.Save(parentCycle);
session.Flush();
删除(父循环);
session.Flush();
创建周期是可行的,但当我尝试删除周期时,我有两个问题:

  • 在delete语句之前,NHibernate执行update语句将ParentCycle设置为NULL。但是,此属性不可为null,因为如果循环没有父循环,它将引用自己
  • 当我使属性为null时,另一个问题发生了。Nhibernate执行更新,现在更新成功,但在此更新过程中不会增加版本号。这是我们审计制度的一个问题。每次更新都应增加版本
我想知道是否有其他人也有同样的问题,理想的解决方案是停止更新,因为它是不必要的。但我似乎无法做到这一点

github
我在

上提供了测试代码,这应该很容易实现,设置为
inverse=“true”

public CycleMap()
{
    ...
    HasMany(x => x.ChildCycles)
        .KeyColumn("ParentCycleID")
         // the setting, instructing NHibernate that other end will care...
        .Inverse()
        .Cascade.AllDeleteOrphan();
    ...
关键是,如果NHibernate知道,另一端(相反的一端)正在关注这一关系,那么它就不必担心

  • 更新(使用null)
  • 删除
关于
inverse=“true”
的详细描述可以在这里找到(我建议大家通读,这是一个结构非常好的概述,对NHibernate仍然有效):


是的,我已经试过了。事实上,我最初的映射有一个逆集合,但它仍然进行更新。我们需要的是确保从绑定到会话的集合中删除对象。然后,级联将迭代所有删除的对象,如果它们被映射为反向对象,它们将被删除。我理解它为什么要进行更新,但是当相关记录已被标记为删除时,这不是必需的。还有,为什么他不在更新时增加版本?对于版本控制,我不确定,通常我在每个对象上都有一个版本的UpdateDate。由于此属性在任何操作期间都会更改,因此版本当然会增加。。。不确定的情况下,当版本化的实体根本不是“更新”d。。。换句话说。和-如果要从集合中删除一个实体,并且如果已删除孤立项。。。NHiberante会做好的。顺序应为1)加载父级。2) 查找子项3)从集合中删除子项4)调用Flush()。。顺便问一下,你怎么可能没有空的父引用?必须有根父级。这样的函数应该为NULL,而不是它的父函数。在没有可空父级的世界中级联。。。可能是非常不可预测的。。。我得说。我想说的是,也许你可以重新评估这个方法。它甚至可以帮助简化这个场景。。。可为空的父项似乎是。。。只是一张便条;)