在Oracle数据库上的FluentNHibernate,可以为空的外键(经典问题?)

时间:2011-10-10 13:43:55

标签: oracle fluent-nhibernate foreign-keys rights

我有点陷阱。

问题

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. AFTER 插入费用之前,不会更新外键。
  3. 这迫使我使列可以为空并允许更新表。

    理想情况下,更新语句不一定是必需的,并且处理NHB内部的一些深处:)。

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

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

    亲切的问候

1 个答案:

答案 0 :(得分:0)

通过在.Inverse()调用上设置HasMany<Expense>,NHibernate会知道哪一方是'父'对象。我相信这将交换插入的顺序。

了解更多信息:

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

Inverse Attribute in NHibernate