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个假设:
Person
一次只能持有一本护照
Passport
没有人就不能存在
问题是,当我将新的 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();
但是在我看来,这是一个棘手的解决方案。
所以,总结一下:
- 我的映射中是否遗漏了什么?
- 以上行为是 NH 中的错误吗?
- 不用hacky能解决吗
Flush()
?
经过长时间的寻找解决方案,我发现有一个 Join
映射,非常适合上述情况。
希望对大家有所帮助。
更多信息在这里:
http://notherdev.blogspot.com/2012/01/mapping-by-code-join.html
我有以下实体:
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个假设:
Person
一次只能持有一本护照Passport
没有人就不能存在
问题是,当我将新的 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();
但是在我看来,这是一个棘手的解决方案。
所以,总结一下:
- 我的映射中是否遗漏了什么?
- 以上行为是 NH 中的错误吗?
- 不用hacky能解决吗
Flush()
?
经过长时间的寻找解决方案,我发现有一个 Join
映射,非常适合上述情况。
希望对大家有所帮助。
更多信息在这里: http://notherdev.blogspot.com/2012/01/mapping-by-code-join.html