所以,我建立了一个很好的域模型。存储库处理数据访问等等。弹出了一个新要求,表明需要使用删除记录原因。到目前为止,删除都相当简单 => Entity.Children.Remove(child)。由于我的 ORM 工具正在处理状态管理,因此没有进行内部更改跟踪。但是,我不确定如何处理这个问题。
1)我可以在父实体中保留一个已删除的子集合,并将更改跟踪从 nHibernate 中拉出并自己处理。
2)??????
所以,我建立了一个很好的域模型。存储库处理数据访问等等。弹出了一个新要求,表明需要使用删除记录原因。到目前为止,删除都相当简单 => Entity.Children.Remove(child)。由于我的 ORM 工具正在处理状态管理,因此没有进行内部更改跟踪。但是,我不确定如何处理这个问题。
1)我可以在父实体中保留一个已删除的子集合,并将更改跟踪从 nHibernate 中拉出并自己处理。
2)??????
好的,这听起来很疯狂,我将再试一次——即使我可能会因为 nHibernate 使用不当而被打屁股。在删除之前,为什么不选择将要删除的子项(您的 id 已经正确?)并转换为您将用于将删除记录到表中的任何实体。将原因添加到实体并保存它们 - 然后继续删除。最好的部分,您可以使用通用实体,即“auditInfo”作为转换结果,并且您可以在事务中执行此操作,以便在出现故障时回滚所有内容!好吧,也许很疯狂但很有创意吧?
您能否实现IInterceptor 接口并覆盖 onDelete 功能以从实体中提取您需要的信息并在删除之前将其发送到记录器(当然使用 NHibernate)?
如果该特定实体类型的删除相对较少,我会向实体添加一个标志以将其标记为逻辑上“已删除”,而不是实际删除该行。然后,应用程序必须在正常情况下处理这些实体的隐藏。
如果这会导致无法接受的“陈旧”行数 - 我会建议类似于 Watson 的回答。根据确切的要求,您可能会直接从应用程序的某处记录已删除的数据和一个额外的“原因”字段。从审计的角度来看,使用拦截器更透明、更令人愉悦,但单独的删除日志(表、数据库、文件)可能更简单。