域驱动设计 - 逻辑删除

时间:2008-10-08 15:59:40

标签: c# .net nhibernate domain-driven-design ddd-repositories

所以,我有一个很好的域模型。存储库处理数据访问,什么不处理。出现了一个新的要求,表明需要使用删除记录原因。到目前为止,删除一直很简单=> Entity.Children.Remove(孩子)。由于我的ORM工具正在处理状态管理,因此没有发生内部更改跟踪。但是,我不确定exactyl如何处理这个问题。

1)我可以在父实体中保留一个已删除的子集合,并将更改跟踪从nHibernate中拉出来并自行处理。

2)??????

3 个答案:

答案 0 :(得分:3)

好吧,这听起来很疯狂,我会再拍一次 - 尽管我可能因为nHibernate使用不当而打屁股。在删除之前,为什么不选择要删除的子项(您的ID已经正确?)并转换为将用于将删除记录到表中的任何实体。将原因添加到实体并保存 - 然后继续删除。最好的部分,您可以使用通用实体,即“auditInfo”来获得转换结果,并且您可以在事务中执行此操作,以便在出现故障时可以回滚所有内容!好吧,也许是疯狂但有创意吧?

答案 1 :(得分:1)

你能否实现IInterceptor interface并覆盖onDelete功能,从实体中提取所需信息,然后在删除之前将其发送到记录器(当然使用NHibernate)?

example

答案 2 :(得分:1)

如果删除对于该特定实体类型相对较少,我会向实体添加一个标记,以将其标记为逻辑“已删除”而不是实际删除该行。然后,应用程序必须在正常情况下处理这些实体的隐藏。

如果这会导致无法接受的“陈旧”行数 - 我会建议类似于Watson的回答。根据具体要求,您可能可以直接从应用程序中删除已删除的数据和一个额外的“原因”字段。从审计的角度来看,使用拦截器更透明,更令人满意,但单独的删除日志(表,数据库,文件)可能更简单。