这是LinqToSQL中的另一个问题,我确信我肯定错过了这个地方的船,因为O / R Designer的行为对我来说非常令人费解......
我的LinqToSQL表有一个基类,我称之为LinqedTable
。我已成功使用反射来获取后代类的所有属性并执行其他标准操作。
现在我想对我的表进行一些自动审计,这样每当插入或删除LinqedTable
记录或字段值发生变化时,我都会将记录插入到审计表中,详细说明更改类型,保存前后的字段名称及其值。
我以为我可以使用PropertyChanging
事件执行此操作,在保存之前跟踪所有已更改的属性,然后在每次SubmitChanges()
调用后清除更改集合。但是 - 由于某些奇怪的原因,来自O / R设计器的生成代码没有在PropertyChanging
事件中提供属性名称 - 它发送一个空字符串! (为什么?!)确实在PropertyChanged
事件中发送属性名称,但是我已经来不及获取原始值。
我想使用OnLoaded()
部分方法获取所有属性的所有原始值 - 但根据定义它是私有的,我需要在基类中访问该方法。即使我使用反射来获取该方法,这也意味着我必须为每个表实现部分方法的另一半,这有点挫败了继承的目的!
我也无法在DataContext中找到任何合适的方法来使用或覆盖。
那么您建议如何使此审核功能正常运行?
答案 0 :(得分:7)
您可以在DataContext上使用GetChangeSet来检索上下文中所有表上发生的更新,插入和删除的列表。您可以使用ITable.GetOriginalEntityState来检索已更改实体的原始值。但是,当您检索已删除或更新的记录的原始值时,这些关联将不可用,因此如果您需要处理相关实体,则必须仅依赖该区域中的外键值。您可以使用ITable.GetModifiedMembers来帮助仅检索已更改的值。
答案 1 :(得分:0)
原谅我可能是一个愚蠢的答案,但是如何使用触发器直接在SQL Server中进行审计(如果您使用的是SQL Server 2005或2008标准)或使用SQL Server 2008 Enterprise中的更改跟踪工具?