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

本文关键字:属性 更新 保存 多对一 冗余 FK Nhibernate | 更新日期: 2023-09-27 17:53:46

我有一个这样的模型:

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插入到历史…所有好。
  3. UPDATE foo set history_ref=, prop1=, prop2=等NH冗余更新history_ref,可以在1处插入。和Foo的所有属性。

我想去掉3。插入时冗余更新和设置history_ref

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

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

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

但是要注意,在这个配置中,子节点被插入到父节点之前,所以如果你在你的子节点到父节点的链接上有FK约束(你真的应该),它会抛出异常,因为你的子节点引用了还不存在的父节点。为了克服这个问题,你必须在数据库中使用DEFERRABLE约束,这是在事务提交时检查的,而不是在插入时检查的。