NHibernate映射。设置join-subclass声明元素的集合和where属性

时间:2010-02-23 15:11:15

标签: c# nhibernate mapping subclass where

我正在开发一个项目,其中持久化数据可以被标记为删除,但保留在数据库中,列(is_deleted)设置为TRUE。

使用hibernate类映射属性“where”并将where =“is_deleted = 0”添加到标记中可以正常工作。但是当我声明一组子类元素时它失败了。

这个简化的例子使用了包含“Wheel”类成员集合的类“Car”,它继承自“CarPart”类:

<class name="Car" where="is_deleted = 0">
  <id name="Identifier" column="car_id">
    <generator class="native" />
  </id>
  <set name="Wheels" lazy="true" where="is_deleted = 0">
    <key column="car_id" />
    <one-to-many class="Wheel" />
  </set>
</class>

<class name="CarPart" where="is_deleted = 0">
  <id name="Identifier" column="part_id">
    <generator class="native" />
  </id>
  <property name="IsDeleted" />

  <joined-subclass name="Wheel" >
    <key column="part_id" />
    <property name="radius" />
  </joined-subclass>
</class>

如果我在代码中尝试访问集合 Car.Wheels ,我会收到SQL错误,因为“where”子句适用于子类的表“转而使用超级“CarPart”的“ ,其中实际定义了IsDeleted属性。

生成的SQL看起来类似于:

select * from Wheel w inner join CarPart cp on...
where w.is_deleted = 0

而不是正确的

select * from Wheel w inner join CarPart cp on...
where cp.is_deleted = 0
  • 这是一个错误吗?或者我错过了 详情?超级CarPart 已经有where =“is_deleted = 0”, 所以逻辑上这应该适用于所有人 定义的子类?
  • 是否有其他添加方法 所有持久化数据的is_deleted标志 在NHibernate?

非常感谢您的帮助

1 个答案:

答案 0 :(得分:0)

我强烈建议为每个软删除表创建一个视图,以过滤掉已删除的记录并在域模型中映射视图。这样做会使映射变得更加容易。

如果您的数据库支持它,您可以在表上创建INSTEAD OF DELETE触发器以设置is_deleted标志而不是删除记录。与视图结合使用,您的域模型可以完全忽略软删除。