2

这是 LinqToSQL 问题中的另一个问题,我确信我一定是错过了某个地方,因为 O/R 设计器的行为让我非常困惑……

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

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

我想我可以使用PropertyChanging事件来做到这一点,在保存之前跟踪所有更改的属性,然后在每次SubmitChanges()调用后清除更改的集合。但是 - 出于某种奇怪的原因,从 O/R 设计器生成的代码没有在PropertyChanging事件中为您提供属性名称 - 它发送一个空字符串!(为什么?!)它确实会在事件中发送属性名称PropertyChanged,但这对我来说已经太迟了,无法获得原始值。

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

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

那么,您会建议什么来使此审核功能正常工作?

4

2 回答 2

7

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

于 2009-05-03T14:22:32.160 回答
0

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

于 2009-05-03T15:02:13.797 回答