我有以下实体:
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这是一个骇人听闻的解决方案。
所以,总结一下:
Flush()
的情况下解决?答案 0 :(得分:0)
长时间寻找解决方案后,我发现有一个Join
映射,非常适合上述情况。
希望它可以帮助某人。
更多信息在这里: http://notherdev.blogspot.com/2012/01/mapping-by-code-join.html