使用Castle ActiveRecord标记“已删除”而非物理删除

时间:2009-09-29 01:14:47

标签: nhibernate activerecord castle

在我目前的项目中,我们收到了一个非常不寻常的请求(对我而言)。客户端希望所有删除过程都标记一个标志,而不是从数据库表中物理删除该记录。乍一看看起来很简单。我只是有变化

public void DeleteRecord(Record record)
{ 
    record.DeleteAndFlush();
}

public IList GetAllRecords()
{
    Record.FindAll().ToList();
}

public void DeleteRecord(Record record)
{ 
   record.Deleted = true;
   record.UpdateAndFlush();
}

public IList GetAllRecords()
{
    Record.FindAll().Where(x=>x.Deleted==false).ToList();
} 

但是在我得到一点时间后再想想。我发现这个小小的改变会导致我的级联设置出现大问题。因为我对Active Record业务很陌生。我不相信自己只需将所有CascaeEnum.Delete更改为CascadeEnum.SaveUpdate。所以,我在这里寻找一些意见。

1)标志是一个标志而不是一个普通的标志吗?

2)如果对问题1的回答是肯定的,那么我相信NHibernate内置了一些东西来处理这个问题。有人能告诉我这种问题的正确方法是什么?

感谢您的意见。

3 个答案:

答案 0 :(得分:2)

这被称为Soft Deletes,它很常见。关于最佳做法存在争议 - 请查看最近的博客文章:http://ayende.com/Blog/archive/2009/08/30/avoid-soft-deletes.aspx

答案 1 :(得分:2)

这很常见,称为“soft delete”。 Here's an implementation这对于NHibernate来说。

答案 2 :(得分:1)

这是一个相对常见的请求,有时会(至少)有两个原因:

  1. 审核和历史记录 - 将行标记为已删除而非物理删除它意味着如果需要,信息仍然可用(例如,如果您意外删除了错误的客户,则包括恢复信息)。
  2. 性能 - 我见过使用此方法批量删除的系统,因此可以在安静的时间进行物理执行。我很怀疑这是现代DBMS所需要的,但我可以看到,如果你想在严重超载的系统上避免级联删除,那么过去可能会如此(当然,你不应该 首先在这样的系统上运行)。 Oracle 8引入了这样一个功能,您可以以这种方式删除列,只有在您提出要求时才会删除它们 - 即使信息尚未完全删除,您根本无法使用该列。授予删除列比删除一行更为密集,但它可能仍有帮助。