使用EF / SQL Server进行转换的数据传输

时间:2018-08-07 09:06:10

标签: c# .net sql-server entity-framework entity-framework-6

我正在尝试编写代码以将数据从一个应用程序传输到该应用程序的新版本。

新旧应用程序均使用SQL Server。 旧的数据库在以下两个主要方面设计不良:它没有正确使用外键,并且具有不必要的其他表(例如,不仅如此,在应该使用枚举的地方使用查找表) )。

我相信使用SSIS的“正确”方法是使用SSIS,但是我对此没有经验,我一直在努力掌握如何正确设置它,因此我在考虑代码-基于解决方案(运行一次控制台应用程序)。

我计划使用Entity Framework来实现这一目标,因为我对使用EF感到很舒服,并且易于设置。

问题的症结在于维护关系,我正在寻找有关维护相关数据的最佳方法的指南。例如,客户有很多地址,地址有客户ID。

如果这么简单,我可以简单地查询客户.include(x => x.Address)并将其用于将客户添加到新数据库中(在此过程中自动在目标数据库中创建新的ID)。但是,由于有很多表(〜30个)都以某种方式链接在一起,每个表都包含许多行数据,所以我觉得这很麻烦而且非常密集,因为可能需要将数据加载到内存中。一击(因为我也必须转换数据)。

另一种方法是SET IDENTITY INSERT并逐个复制表,在新表中保留旧的ID,但这是错误的。

除了让自己参加SSIS课程之外,还有其他选择吗?

1 个答案:

答案 0 :(得分:1)

SSIS更适合于转换来自不同来源/目的地的数据。如果两个数据库都使用SQL Server,那么我将只考虑通过SQL查询迁移表结构。 EF是可能的,但是会更慢并且会占用更多资源,尤其是如果不在数据库服务器本身上运行时。 (数据通过电线返回)

例如,我有一个表,该表通过“ OrderNumber”与Order表相关,我想迁移该表以将OrderId与FK一起使用。我在构造新表时将OrderId包括为Nullable,还包括OrderNumber,通常在其后加上下划线以提醒该列将被删除。我导入具有指向临时列的订单号的数据,然后执行第二次更新以更新OrderId。在检查完所有的OrderId(无剩余空值)之后,可以将OrderId列设为不可为空,建立FK和约束,并删除多余的OrderNumber_列。执行这些更改时,通常最好设置没有约束/索引的表,然后在移植数据后创建它们。 (更快,但是您想合理地确定您的数据正确而完整地传递)。在最终确定新的FK之前,分解建议的数据结构并一次将其与表进行传输/重新关联。临时表也可以用于棘手的情况。所有这些都可以在还原的备份上执行,以证明其概念,编写脚本并设置为在备份的生产服务器上运行,只要您满意它的完成和测试即可。

将查找表与支持的枚举组合在一起会比删除查找表更好。查找表中带有FK的值有助于在数据库级别上实现引用完整性,并在查询时帮助为任意值提供含义。我通常将与枚举关联的查找表后缀“ Enum”作为后缀,以指示这些表受代码控制并且应为只读。您还可以设置插入/更新/删除触发器,以防止更改这些表。 (当您需要扩展枚举时,哪些更新脚本可以禁用并重新建立)