Nhibernate 标记“;删除“;而不是使用Castle ActiveRecord进行物理删除

Nhibernate 标记“;删除“;而不是使用Castle ActiveRecord进行物理删除,nhibernate,activerecord,castle,Nhibernate,Activerecord,Castle,在我目前的项目中,我们(向我)提出了一个相当不寻常的要求。客户机希望所有删除过程都标记一个标志,而不是从数据库表中实际删除记录。乍一看很容易。我只有零钱 public void DeleteRecord(Record record) { record.DeleteAndFlush(); } public IList GetAllRecords() { Record.FindAll().ToList(); } 到 但在我有一点时间再考虑之后。我发现这个小小的改变会给我的级联设

在我目前的项目中,我们(向我)提出了一个相当不寻常的要求。客户机希望所有删除过程都标记一个标志,而不是从数据库表中实际删除记录。乍一看很容易。我只有零钱

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

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

但在我有一点时间再考虑之后。我发现这个小小的改变会给我的级联设置带来巨大的问题。因为我对活动唱片业务还很陌生。我不相信自己会简单地将所有cascaenum.Delete更改为cascadenum.SaveUpdate。所以,我在这里寻找一些输入

1) 该标志是否是一种标志,而不是一种常见的物理要求

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


感谢您的输入。

这称为软删除,非常常见。关于最佳实践存在一些争论-请查看最近的这篇博客文章:

这被称为软删除,它非常常见。关于最佳实践存在一些争论-请查看最近的博客帖子:

这很常见,被称为“”。对于NHibernate来说,这是非常常见的,称为“”。对于NHibernate来说,这是一个相对常见的请求,有时实现它至少有两个原因:

  • 审核和历史记录—将行标记为已删除,而不是实际删除,这意味着信息在需要时仍然可用(包括恢复信息,例如,如果您意外删除了错误的客户)
  • 性能-我见过使用这种方法批量删除的系统,这样它们就可以在安静的时间物理地执行。我怀疑现代DBMS是否需要这样做,但我可以看出,如果您希望避免在严重过载的系统上进行级联删除(当然,您首先不应该在这样的系统上运行),过去可能是这样的。Oracle 8引入了这样一种功能,您可以通过这种方式删除列,并且只有在您提出请求时,它才会实际删除这些列—即使信息尚未完全删除,您也无法使用该列。允许删除一列比删除一行更密集,但它仍然有帮助

  • 这是一个相对常见的请求,有时实现它至少有两个原因:

  • 审核和历史记录—将行标记为已删除,而不是实际删除,这意味着信息在需要时仍然可用(包括恢复信息,例如,如果您意外删除了错误的客户)
  • 性能-我见过使用这种方法批量删除的系统,这样它们就可以在安静的时间物理地执行。我怀疑现代DBMS是否需要这样做,但我可以看出,如果您希望避免在严重过载的系统上进行级联删除(当然,您首先不应该在这样的系统上运行),过去可能是这样的。Oracle 8引入了这样一种功能,您可以通过这种方式删除列,并且只有在您提出请求时,它才会实际删除这些列—即使信息尚未完全删除,您也无法使用该列。允许删除一列比删除一行更密集,但它仍然有帮助

  • 谢谢你的快速回复。我很高兴地发现,即使是像ayende这样的大人物也和我一样担心:)谢谢你的快速回复。很高兴发现,即使是像ayende这样的大人物也和我有类似的担忧:)谢谢Mauricio,我试图将你的回答标记为答案,但系统只允许一个答案。所以我必须长期坚持下去,美国海关与边境保护局的答复大约提前了1分钟。谢谢你的回答。所以这里有一个向上的投票,至少给你一些接受的代表,如果不是勾号本身:-)谢谢毛里西奥,我试着把你的回答标记为答案,但系统只允许一个答案。所以我必须长期坚持下去,美国海关与边境保护局的答复大约提前了1分钟。谢谢你的回答。所以这里有一个向上的投票,至少给你一些接受的代表,如果不是勾选本身的话:-)
    public void DeleteRecord(Record record)
    { 
       record.Deleted = true;
       record.UpdateAndFlush();
    }
    
    public IList GetAllRecords()
    {
        Record.FindAll().Where(x=>x.Deleted==false).ToList();
    }