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



我有以下实体:

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);
});

DB架构:

Table Person:
Id | Name | PassportId
Table Passport:
Id | PassportNo | other props.

正如我们所看到的,Person有它的护照,但护照不知道它的主人,这就是我想要的行为。还有两个假设:

  • Person一次只能有一本护照
  • Passport离不开人

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

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

生成的SQL查询是INSERT和UPDATE(插入新的Passport,并用新的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();

然而,国际海事组织认为这是一个棘手的解决方案。

所以,总结一下:

  • 我的映射中遗漏了什么吗
  • 以上行为是NH的错误吗
  • 它能在没有破解Flush()的情况下解决吗

经过长时间的解决方案搜索,我发现有一个Join映射,它非常适合上面的场景。

希望它能帮助到别人。

更多信息请点击此处:http://notherdev.blogspot.com/2012/01/mapping-by-code-join.html

相关内容

  • 没有找到相关文章

最新更新