C# 最;“正确”;检测数据库更改的方法

C# 最;“正确”;检测数据库更改的方法,c#,sql-server,C#,Sql Server,我们有几百行代码,根据一些复杂的逻辑决定是否应该从某个遗留系统更新某些实体的某些列。 这些列不一定会得到不同的值,如果满足要求,则会为它们分配新值,而不管旧值是什么 现在我们已经开始使用时态表(这是SQL Server的一项功能),即一旦对某个记录执行了update语句,就会将旧记录保存在“历史表”中 问题:由于此代码可能会更新成千上万条记录,并且每天都在运行,因此我们希望避免历史记录表中有数百万条记录,这些记录实际上与原始记录没有任何不同,但由于我们“更新”了一条记录,因此它们被保存为“历史记

我们有几百行代码,根据一些复杂的逻辑决定是否应该从某个遗留系统更新某些实体的某些列。
这些列不一定会得到不同的值,如果满足要求,则会为它们分配新值,而不管旧值是什么

现在我们已经开始使用时态表(这是SQL Server的一项功能),即一旦对某个记录执行了
update
语句,就会将旧记录保存在“历史表”中

问题:由于此代码可能会更新成千上万条记录,并且每天都在运行,因此我们希望避免历史记录表中有数百万条记录,这些记录实际上与原始记录没有任何不同,但由于我们“更新”了一条记录,因此它们被保存为“历史记录”

代码是用C#和EF编写的,但是我们使用
.NoTracking()
来提高性能

我们考虑过的一些备选方案:

  • 在保存之前,检查相关实体的所有相关列,并检查是否有任何更改。
    这个解决方案有一个很大的缺陷——下一个将在代码中添加一些列的人肯定不知道应该更新“更改检测”代码

  • 在这段代码中创建更新列的方法,这些方法更新列,并勾选一些表示我们已经更改了某些内容的标志。下一个阅读该代码的人肯定会遇到其中任何一个,并且必须理解为什么需要它。。但这种解决方案感觉非常尴尬

  • 可能在数据库中使用一些触发器来检测和避免不更改的更新。再一次-可能没有人会记得更新它。特别是因为我们目前的系统中没有一个触发器

  • 避免
    NoTracking
    并使用EF的
    ChangeTracker.DetectChanges
    方法。根据文档,此方法存在性能问题,而性能是这里的一个问题


  • 到目前为止,我们还没有找到一个体面、优雅的解决方案。

    1和3听起来像是流程/文档/代码审查问题。因此,如果没有一个技术替代方案是有吸引力的,那么您可以通过这种方式解决问题。您是否使用
    ChangeTracker.DetectChanges
    实际测试了性能?文档对性能发出警告的原因是,当不需要时(例如,当您生成的对象未被修改并卡回数据库时),您不会使用该功能。但是您的用例实际上正是该特性的设计目的,因此编写您自己的更改检测可能会重新引入类似的性能影响。您可能会发现它比以前更快,因为它不会试图更新一堆没有更改的行。1和3听起来像是流程/文档/代码审查问题。因此,如果没有一个技术替代方案是有吸引力的,那么您可以通过这种方式解决问题。您是否使用
    ChangeTracker.DetectChanges
    实际测试了性能?文档对性能发出警告的原因是,当不需要时(例如,当您生成的对象未被修改并卡回数据库时),您不会使用该功能。但是您的用例实际上正是该特性的设计目的,因此编写您自己的更改检测可能会重新引入类似的性能影响。您可能会发现它比以前运行得更快,因为它不会试图更新一堆未更改的行。