在两个数据库之间同步数据时处理DelteBehavior.Restrict
在两个数据库之间同步数据时处理DelteBehavior.Restrict
我们需要在两个数据库之间保持一个特定表的同步。为此,存在一个后台作业。该过程如下:
- 在db1中查询表中的所有数据
- 将数据映射到db2中的EF Core实体
- 清除db2中表中的现有行
- 最后将映射实体插入db2中的表中
然而,该表与db2中的其他表存在关系。这些表通过外键引用它。FK的DeleteBehavior枚举设置为Restrict。
因此,在步骤3中删除现有记录时会出现异常,因为其他表中存在依赖的实体。
为了解决这个问题,调用以下过程,临时禁用所有关系约束。然后,在删除和重新插入记录之后,将其恢复。
这个方法可以正常工作,但我觉得非常丑陋。你对此有什么看法?有人能提出更好的建议吗?
非常感谢任何建议或建议!以下是禁用FK约束的存储过程(来源here)
DROP PROCEDURE [schema].[disableFks] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [schema].[disableFks] AS DECLARE @sql NVARCHAR(MAX) = N''; with SCH as ( select SCHEMA_ID from sys.schemas where name in ('sch1', 'sch2', 'sch3') ) , FKS AS ( SELECT DISTINCT obj = QUOTENAME(OBJECT_SCHEMA_NAME(parent_object_id)) + '.' + QUOTENAME(OBJECT_NAME(parent_object_id)) FROM sys.foreign_keys WHERE sys.foreign_keys.schema_id in (select schema_id from SCH) ) SELECT @sql += N'ALTER TABLE ' + obj + ' NOCHECK CONSTRAINT ALL;' FROM FKS; EXEC sp_executesql @sql; GO