NHibernate 5.1 ManyToOne-删除孤立孤儿无法正常工作

时间:2018-11-13 13:53:02

标签: nhibernate many-to-one mapping-by-code

我有以下实体:

public class Person {
    public int Id {get;set;}
    public String Name {get;set;}
    public Passport Passport {get;set;}
}

public class Passport {
    public int Id {get;set;}
    public String PassportNo {get;set;}
    // ... other properties
}

和以下映射(对于人):

ManyToOne(x => x.Passport, m =>
    {
        m.Column("PassportId");
        m.Lazy(LazyRelation.NoLazy);
        m.Unique(true);
        m.Cascade(Cascade.All | Cascade.DeleteOrphans);
    });

数据库架构:

Table Person:

Id | Name | PassportId

Table Passport:

Id | PassportNo | other props.

我们可以看到,Person拥有护照,但是护照不知道其所有者,这是我想要的行为。还有2个假设:

  • Person一次只能拥有一本护照
  • Passport不能没有人

问题是,当我将新的Passport分配给Person时,旧的Passport仍保留在数据库中。

person.Passport = new Passport() { PassportNo = "AB 123456" };
// ...
session.Flush();
session.Commit();

生成的SQL查询是INSERT和UPDATE(插入新的Passport,并用新的Person更新Passport)-但是旧的孤立护照上没有DELETE

我发现的解决方法是将当前Passport设置为null,调用session.Flush(),然后分配新的Passport,如下所示:

person.Passport = null;
session.Flush();
person.Passport = new Passport() { PassportNo = "AB 123456" };
// ...
session.Flush();
session.Commit();

但是IMO这是一个骇人听闻的解决方案。

所以,总结一下:

  • 我在映射中缺少什么吗?
  • 以上行为是NH中的错误吗?
  • 是否可以在没有Flush()的情况下解决?

1 个答案:

答案 0 :(得分:0)

长时间寻找解决方案后,我发现有一个Join映射,非常适合上述情况。

希望它可以帮助某人。

更多信息在这里: http://notherdev.blogspot.com/2012/01/mapping-by-code-join.html