我需要在EF4 ASP.NET MVC3应用程序中保留某些字段的值的历史记录。这只需要是一个日志文件,记录用户,日期时间,表名,字段名,旧值,新值。
虽然在各种保存例程中对此进行编码非常容易,但我想知道是否可以通过将其连接到某种数据注释来获得全局覆盖,以便我可以声明
[KeepHistory()]
public string Surname { get; set; }
在我的部分课程中(我正在使用POCO但是从T4模板生成)。
所以问题
1)这是个坏主意吗?作为注释的结果,我基本上建议对实体进行副作用更改,而不是由代码直接引用。
2)可以吗?我是否可以访问正确的上下文以与我的工作单元相关联,以便通过上下文保存来保存或删除更改?
3)有更好的方法吗?
4)如果你建议我这样做,任何指针都会受到赞赏 - 我读过的所有内容都是为了验证,这可能不是最好的起点。
答案 0 :(得分:2)
实际上,验证可能是一个很好的起点。由于属性不知道它被分配给哪个属性或类,但验证框架会使用所有必要的信息调用验证属性。如果实现System.ComponentModel.DataAnnotations.ValidationAttribute类,则可以覆盖IsValid(对象,ValidationContext)方法,该方法为您提供属性的实际值,属性的名称和容器。
这可能需要很多工作,因为你需要访问当前登录的用户等。我猜测.NET实现为实体类型的特定属性提供了某种缓存,这会自己实施是一种痛苦。
另一种方法是使用EF ObjectContext公开的ObjectStateManager,它可以为给定状态的所有实体提供ObjectStateEntry对象。见 ObjectStateManager.GetObjectStateEntries(EntityState)方法,有关如何调用它(以及何时)的更多信息。 ObjectStateEntry实际上包含原始值和当前值的记录,可以对其进行比较以查找在当前ObjectContext的生命周期内所做的任何更改。
您可以考虑使用ObjectStateManager注入自定义日志记录行为,而此行为基于属性属性决定应记录更改。