【问题标题】:FluentNHibernate on a Oracle database, nullable foreignkey (Classic issue?)Oracle 数据库上的 FluentNHibernate,可为空的外键(经典问题?)
【发布时间】:2011-12-04 13:11:03
【问题描述】:

我有点卡住了。

问题

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 都是从序列BEFORE插入中请求的。
  2. 在插入费用后之后才会更新外键。

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

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

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

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

亲切的问候

【问题讨论】:

    标签: oracle fluent-nhibernate foreign-keys rights


    【解决方案1】:

    通过在您的HasMany&lt;Expense&gt; 调用上设置.Inverse(),NHibernate 将知道哪一侧是“父”对象。我相信这会交换插入的顺序。

    更多信息:

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

    Inverse Attribute in NHibernate

    【讨论】:

    • 会的,但不幸的是,这也会破坏我的模型:/.
    • 有了这个(而不是调用存储库并独立保存),也许可以在 NHibernate 用户组 (groups.google.com/group/nhusers) 上询问。如果他们能提供 NH XML 代码,我们可以找到一种方法让它在 FNH 中工作(或在 github.com/jagregory/fluent-nhibernate 提交补丁)。
    猜你喜欢
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    • 2019-08-12
    • 2020-01-14
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多