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中找到任何合适的方法来使用或覆盖.
那么您会建议什么才能使此审计功能正常工作?
您可以在DataContext上使用GetChangeSet来检索上下文中所有表上发生的更新,插入和删除的列表.您可以使用ITable.GetOriginalEntityState来检索已更改实体的原始值.但是,当您检索已删除或更新的记录的原始值时,这些关联将不可用,因此如果您需要处理相关实体,则必须仅依赖该区域中的外键值.您可以使用ITable.GetModifiedMembers来帮助仅检索已更改的值.