我正在使用NHibernate并且有一个要求,当我删除一行时,我不应该硬删除该行而是将状态更新为已删除并设置一些系统属性,如谁删除等。
为此,我决定使用自定义sql语句,如。
<sql-delete>
update PPDE set SysStatusID = 2 where PPDID =?
</sql-delete>
在sql语句中我能够引用id,但是如何将SysUserID更新为删除该行的用户。
基本上如何在自定义sql语句中设置动态参数值。
非常感谢任何帮助。
答案 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)
但是在持久性操作中没有一个好的方法可以使用业务规则。您的企业必须独立于删除等持久性操作。