我有点卡住了。
问题
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 ...
注意这里的两件事:
- 在插入之前从序列中请求所有 id 。
- 在插入费用之后,外键才会更新。
这迫使我使列可以为空并允许对表进行更新。
理想情况下,更新语句不应该是必要的,而是在 NHB 内部处理了一些黑暗的地方:)。
这可以通过进行双向引用来解决,但这会破坏我的模型:/。
我确实相信这对我来说是一个回归问题(以前从未找到过好的解决方案)。有没有人知道解决方法?
亲切的问候