Nhibernate单向多对一冗余FK,所有属性在保存期间更新

时间:2016-07-01 16:50:23

标签: c# nhibernate

我有一个这样的模型:

class Foo
{
    public IList<HistoryRecord> History {get;set;}
    public HistoryRecord HistoryReference {get;} //Computed, null or item from History.
}

我厌倦了这样的地图:

<list name="History" cascade="all-delete-orphan" inverse="false" table="history">
      <key column="foo_fk" not-null="true" update="false"/>
      <index column="idx"/>
      <one-to-many class="HistoryRecord" />
</list>
<many-to-one name="HistoryReference" cascade="none" access="readonly" column="history_ref" class="HistoryRecord"/>

它可以生成多余的SQL:

  1. INSERT INTO foo ... - 不指定history_ref,它会插入NULL。
  2. N INSERTS INTO history ... all good。
  3. UPDATE foo set history_ref =,prop1 =,prop2 =,等NH冗余更新history_ref,可以插入1.和Foo的所有属性。
  4. 我想摆脱3.冗余更新并在插入期间设置history_ref。

1 个答案:

答案 0 :(得分:0)

通过将多对一的级联顺序从NONE更改为ALL,我能够完成这项工作。

<many-to-one name="HistoryReference" cascade="ALL" access="readonly" column="history_ref" class="HistoryRecord"/>

但请注意,在此配置中,子项是在父项之前插入的,因此如果您对子级到父级链接有FK约束(并且您确实应该),则会抛出异常,因为您的子级引用了尚不存在的父级。要克服它,你必须在数据库中使用DEFERRABLE约束,这在事务提交时检查,而不是在插入时刻。