在Nhibernate中使用自定义sql语句删除行

时间:2009-05-27 17:06:40

标签: nhibernate

我正在使用NHibernate并且有一个要求,当我删除一行时,我不应该硬删除该行而是将状态更新为已删除并设置一些系统属性,如谁删除等。

为此,我决定使用自定义sql语句,如。

<sql-delete>
  update PPDE set SysStatusID = 2 where PPDID =? 
</sql-delete>

在sql语句中我能够引用id,但是如何将SysUserID更新为删除该行的用户。

基本上如何在自定义sql语句中设置动态参数值。

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:1)

实现所需的一种方法是实现一个DeleteEvent-listener,当nhibernate决定删除实体时会触发该侦听器。从那里,基于某些逻辑(通常您在实体上寻找接口),您可以决定是要硬删除还是软删除实体。如果您正在软删除它,您可以更新“IsDeleted”,“DeletedAt”,“DeletedBy”等属性。

可以在以下网址找到详细描述上述内容的博文:The NHibernate FAQ - Soft Deletes

答案 1 :(得分:0)

您可以使用interceptor

执行此操作
    public void OnDelete(object entity,
                         object id,
                         object[] state,
                         string[] propertyNames,
                         IType[] types)
    {
        // if entity is myentity 
        // update user property
    }

答案 2 :(得分:0)

Hibernate将尝试使用您实体的值自动替换“?”。当您调用session.Delete(entity)时,它将使用映射到PPDID列的属性的值。

话虽如此,我认为在这种情况下使用自定义sql语句是个坏主意。恕我直言,您的代码将难以理解和维护。当某人看到session.Delete(entity)时,他会期望执行DELETE语句,但它会获得UPDATE语句。我会坚持在session.Update(entity)之前设置正确的值。

答案 3 :(得分:0)

但是在持久性操作中没有一个好的方法可以使用业务规则。您的企业必须独立于删除等持久性操作。