📜  NHibernate-级联(1)

📅  最后修改于: 2023-12-03 14:44:36.402000             🧑  作者: Mango

NHibernate 级联

什么是级联

在 NHibernate 中,级联指的是当一个对象被持久化时,其关联的对象是否也应该被持久化或更新或删除。例如,在一个订单对象中,与之关联的订单项对象也应该被持久化或更新或删除。级联可以在映射文件中配置。

级联类型

NHibernate 提供了多种级联类型:

  • none,不执行任何级联操作。
  • save-update,当一个对象被插入或更新时,所有关联的对象也会被插入或更新。
  • delete,当一个对象被删除时,所有关联的对象也会被删除。
  • delete-orphan,当一个对象被删除时,所有关联的对象也会被删除。同时,如果一个关联的对象不再和任何其他的对象关联,它也会被删除,被称为“孤儿”对象。
  • all,包含 save-update、delete 以及 delete-orphan。

级联的类型可以通过映射关系中的cascade属性设置。

配置级联

下面是一个示例,订单对象中包含多个订单项对象。使用级联操作可以在插入订单时一并插入所有订单项。

<class name="Order" table="orders">
  <id name="Id" column="id">
    <generator class="native"/>
  </id>
  <property name="Code" column="code"/>
  
  <bag name="Items" cascade="all" inverse="true">
    <key column="order_id"/>
    <one-to-many class="OrderItem"/>
  </bag>
</class>

<class name="OrderItem" table="order_items">
  <id name="Id" column="id">
    <generator class="native"/>
  </id>
  <property name="Name" column="name"/>
  <property name="Quantity" column="quantity"/>
  
  <many-to-one name="Order" class="Order" column="order_id"/>
</class>

在上面的映射中,Items集合包含多个OrderItem对象,并设置了级联类型为all,即插入订单时会级联插入所有订单项。注意,在映射OrderItem时,也需要映射双向关联Order

注意事项

配置级联时需要注意以下几点:

  • 关联对象必须也已经映射过,即必须有对应的类映射文件;
  • 避免出现级联循环,即 A 的级联包含 B,而 B 的级联又包含 A;
  • 不要滥用级联操作,会导致性能问题和数据不一致问题。
结论

级联是 NHibernate 中非常强大的特性,可以方便地处理对象之间的关联关系。在使用级联时需要谨慎,避免滥用导致问题。了解 NHibernate 中级联类型的使用,可以在实际工作中更好地应用此特性。