LinqToSQL和审计更改了字段

时间:2009-05-03 14:18:16

标签: c# .net linq linq-to-sql or-designer

这是LinqToSQL中的另一个问题,我确信我肯定错过了这个地方的船,因为O / R Designer的行为对我来说非常令人费解......

我的LinqToSQL表有一个基类,我称之为LinqedTable。我已成功使用反射来获取后代类的所有属性并执行其他标准操作。

现在我想对我的表进行一些自动审计,这样每当插入或删除LinqedTable记录或字段值发生变化时,我都会将记录插入到审计表中,详细说明更改类型,保存前后的字段名称及其值。

我以为我可以使用PropertyChanging事件执行此操作,在保存之前跟踪所有已更改的属性,然后在每次SubmitChanges()调用后清除更改集合。但是 - 由于某些奇怪的原因,来自O / R设计器的生成代码没有在PropertyChanging事件中提供属性名称 - 它发送一个空字符串! (为什么?!确实PropertyChanged事件中发送属性名称,但是我已经来不及获取原始值。

我想使用OnLoaded()部分方法获取所有属性的所有原始值 - 但根据定义它是私有的,我需要在基类中访问该方法。即使我使用反射来获取该方法,这也意味着我必须为每个表实现部分方法的另一半,这有点挫败了继承的目的!

我也无法在DataContext中找到任何合适的方法来使用或覆盖。

那么您建议如何使此审核功能正常运行?

2 个答案:

答案 0 :(得分:7)

您可以在DataContext上使用GetChangeSet来检索上下文中所有表上发生的更新,插入和删除的列表。您可以使用ITable.GetOriginalEntityState来检索已更改实体的原始值。但是,当您检索已删除或更新的记录的原始值时,这些关联将不可用,因此如果您需要处理相关实体,则必须仅依赖该区域中的外键值。您可以使用ITable.GetModifiedMembers来帮助仅检索已更改的值。

答案 1 :(得分:0)

原谅我可能是一个愚蠢的答案,但是如何使用触发器直接在SQL Server中进行审计(如果您使用的是SQL Server 2005或2008标准)或使用SQL Server 2008 Enterprise中的更改跟踪工具?