Nhibernate在删除之前阻止更新

时间:2015-03-15 15:44:14

标签: c# nhibernate fluent-nhibernate self-reference

我有一个自引用对象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();

循环的创建有效,但当我尝试删除循环时,我有两个问题:

  • 在删除语句之前,NHibernate执行update语句将ParentCycle设置为NULL。但是,此属性不可为空,因为如果循环没有父级,则它引用自己。
  • 当我使属性可以为空时,会出现另一个问题。 Nhibernate执行现在成功的更新,但在此更新期间它不会增加版本号。这对我们的审计系统来说是一个问题。每次更新时都应该增加版本。

我想知道是否有其他人有同样的问题,理想的解决方案是停止更新,因为这是不必要的。但我似乎无法做到这一点。

Github上

我在GitHub

上提供了测试代码

1 个答案:

答案 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知道,另一端(反向的)正在关注这种关系,那就不必发布了

  • update(with null)
  • 删除

inverse="true"的深层描述可以在这里找到(我真的建议通读,它是非常结构化的概述,对NHibernate仍然有效)

inverse = “true” example and explanation by mkyong