NHibernate 5.1 ManyToOne - 删除孤儿未按预期工作

NHibernate 5.1 ManyToOne - delete orphan not working as expected

我有以下实体:

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
}

和以下映射(对于 Person):

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个假设:

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

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

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

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

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

但是在我看来,这是一个棘手的解决方案。

所以,总结一下:

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

希望对大家有所帮助。

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