LinqToSQL和审计更改了字段

Sha*_*ica 2 .net c# linq or-designer linq-to-sql

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

我有一个我的LinqToSQL表的基类,我打电话给LinqedTable.我已成功使用反射来获取后代类的所有属性并执行其他标准操作.

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

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

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

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

那么您会建议什么才能使此审计功能正常工作?

Blu*_*kMN 7

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