我有以下实体:
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