我有点陷阱。
问题
NHibernate强迫我将一个外键列设为可空,这对我们的数据库来说是一个非常糟糕的想法而且非常难看。
有解决方法吗?
场合
我有以下地图(为简单起见,名称已更改):
public class BillMap : SequenceGeneratedIdEntityMap<Bill>
{
public BillMap()
{
Id(x => x.Id).GeneratedBy.Native("BILL_SEQ");
... (maps) ...
HasMany<Expense>(f => f.Expense)
.Schema("ACCOUNT")
.Table("EXPENSE")
.KeyColumn("BILL")
.Cascade.All();
}
}
public class ExpenseMap : SequenceGeneratedIdEntityMap<Expense>
{
public ExpenseMap ()
{
Id(x => x.Id).GeneratedBy.Native("EXPENSE_SEQ");
... (maps) ...
}
}
使用这些地图,我在保存Bill的实例时从NHibernate获得以下内容:
select ACCOUNT.BILL_SEQ.nextval from dual
select ACCOUNT.EXPENSE_SEQ.nextval from dual
command 0:INSERT INTO ACCOUNT.BILL(...)
command 0:INSERT INTO ACCOUNT.EXPENSE(...)
command 0:UPDATE UPDATE.EXPENSE SET BILL = X WHERE ...
请注意以下两点:
这迫使我使列可以为空并允许更新表。
理想情况下,更新语句不一定是必需的,并且处理NHB内部的一些深处:)。
这可以通过制作双向引用来解决,但这会破坏我的模型:/。
我相信这对我来说是一个回归的问题(之前从未找到过一个好的解决方案)。有没有人知道解决方法?
亲切的问候
答案 0 :(得分:0)
通过在.Inverse()
调用上设置HasMany<Expense>
,NHibernate会知道哪一方是'父'对象。我相信这将交换插入的顺序。
了解更多信息: