2011-02-24 103 views
2

我有一个要求,可以在EF4 ASP.NET MVC3应用程序中保留某些字段值的历史记录。这只需要是一个排序日志文件,记录用户,日期时间,表名,字段名,旧值,新值。保留EF实体的特定属性值的历史记录

虽然这将是很容易在不同的代码保存这个程序,我想知道如果我可以通过它的布线成某种dataannotation的获得全球覆盖,这样我或许可以申报

[KeepHistory()] 
public string Surname { get; set; } 

在我的部分类(我使用POCO,但从T4模板生成)。

所以问题

1)这是一个坏主意吗?我基本上建议对实体进行副作用更改,而不是由代码直接引用,作为注释的结果。

2)可以这样做吗?我是否可以访问正确的上下文以配合我的工作单元,以便保存或删除上下文保存中的更改?

3)有没有更好的方法? 4)如果你建议我这样做,任何指针将不胜感激 - 我读过的所有内容都是用于验证的,这可能不是最好的起点。

+0

我知道Hibernate和Envers http://www.jboss.org/envers一样。我不知道EF或类似框架的任何.Net端口,但如果你需要自己实现它,你可能会'借用'一些好主意...... – rene 2011-02-24 17:08:42

+0

恩弗斯正是我想要的EF!至少这表明我可能不是唯一一个认为这种行为会是个好主意的人! – Andiih 2011-02-24 18:09:32

+1

[“NHibernate Envers喜欢使用Entity Framework 6 +审计日志”](http://stackoverflow.com/q/24257164/1997229) – 2014-09-18 16:18:24

回答

2

实际上,验证可能是一个很好的起点。由于一个属性不知道它被分配给哪个属性或类,但是验证属性会被验证框架调用并提供所有必要的信息。如果实现System.ComponentModel.DataAnnotations.ValidationAttribute类,则可以重写IsValid(object,ValidationContext)方法,该方法将为您提供属性的实际值,属性名称和容器的名称。

这可能需要很多工作,因为你需要去当前登录的用户等等。我猜测.NET实现提供某种实体类型的特定属性的缓存,将是一个痛苦,自己执行。

另一种方法是使用EF ObjectContext公开的ObjectStateManager,它可以为给定状态的所有实体提供ObjectStateEntry对象。有关如何调用它(以及何时)的更多信息,请参阅 ObjectStateManager.GetObjectStateEntries(EntityState)方法。 ObjectStateEntry实际上包含原始值和当前值的记录,可以比较它们以查找在当前ObjectContext的生存期内所做的任何更改。

您可能会考虑使用ObjectStateManager来注入自定义日志记录行为,而此行为根据属性属性决定应记录哪些更改。

相关问题