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:
- INSERT INTO foo…——不指定history_ref,插入NULL。
- N插入到历史…所有好。
- UPDATE foo set history_ref=, prop1=, prop2=等NH冗余更新history_ref,可以在1处插入。和Foo的所有属性。
我想去掉3。插入时冗余更新和设置history_ref
通过将多对一的级联顺序从NONE更改为ALL,我能够使此工作。
<many-to-one name="HistoryReference" cascade="ALL" access="readonly" column="history_ref" class="HistoryRecord"/>
但是要注意,在这个配置中,子节点被插入到父节点之前,所以如果你在你的子节点到父节点的链接上有FK约束(你真的应该),它会抛出异常,因为你的子节点引用了还不存在的父节点。为了克服这个问题,你必须在数据库中使用DEFERRABLE约束,这是在事务提交时检查的,而不是在插入时检查的。