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
实际测试了性能?文档对性能发出警告的原因是,当不需要时(例如,当您生成的对象未被修改并卡回数据库时),您不会使用该功能。但是您的用例实际上正是该特性的设计目的,因此编写您自己的更改检测可能会重新引入类似的性能影响。您可能会发现它比以前运行得更快,因为它不会试图更新一堆未更改的行。