1

我有点卡住了。

问题

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 ...

注意这里的两件事:

  1. 在插入之前从序列中请求所有 id 。
  2. 在插入费用之后,外键才会更新。

这迫使我使列可以为空并允许对表进行更新。

理想情况下,更新语句不应该是必要的,而是在 NHB 内部处理了一些黑暗的地方:)。

这可以通过进行双向引用来解决,但这会破坏我的模型:/。

我确实相信这对我来说是一个回归问题(以前从未找到过好的解决方案)。有没有人知道解决方法?

亲切的问候

4

1 回答 1

0

通过设置.Inverse()您的HasMany<Expense>呼叫,NHibernate 将知道哪一侧是“父”对象。我相信这将交换插入的顺序。

了解更多信息:

http://wiki.fluentnhibernate.org/Getting_started#Mappings

NHibernate 中的逆属性

于 2011-10-10T21:18:24.333 回答