c# - ORM 是用于迁移数据的正确工具吗?

标签 c# .net sql nhibernate orm

背景

我们正在升级旧版导入工具,它的作用是将数据从连接到 SQL Server 的一个数据库移动到同一服务器上的第二个数据库,该数据库具有不同的架构,并在此过程中执行转换和映射。

下面是一个例子来帮助解释正在发生的事情

假设源数据库有一个名为 Client_Info 的表,目标表有两个名为 ClientsCities 的表

Source.dbo.Client_Info

+-----------+----------+----------+-------+
| FirstName | LastName |   City   | State |
+-----------+----------+----------+-------+
| John      | Smith    | Richmond | VA    |
| Jeff      | Walters  | New York | NY    |
+-----------+----------+----------+-------+

Dest.dbo.Clients

+-----------+-------------+--------------------------------------+
| FirstName |  LastName   |               CityGuid               |
+-----------+-------------+--------------------------------------+
| Scott     | Chamberlain | 07d954bf-3214-4df4-b640-48c27db2b1ed |
+-----------+-------------+--------------------------------------+

Dest.dbo.Cities

+--------------------------------------+----------+-------+
|               CityGuid               | CityName | State |
+--------------------------------------+----------+-------+
| 07d954bf-3214-4df4-b640-48c27db2b1ed | Richmond | VA    |
+--------------------------------------+----------+-------+

合并后我希望目的地看起来像这样

Dest.dbo.Clients

+-----------+-------------+--------------------------------------+
| FirstName |  LastName   |               CityGuid               |
+-----------+-------------+--------------------------------------+
| Scott     | Chamberlain | 07d954bf-3214-4df4-b640-48c27db2b1ed |
| John      | Smith       | 07d954bf-3214-4df4-b640-48c27db2b1ed |
| Jeff      | Walters     | 98a75f88-eeaa-49ba-b464-2ac988a7b093 |
+-----------+-------------+--------------------------------------+

Dest.dbo.Cities

+--------------------------------------+----------+-------+
|               CityGuid               | CityName | State |
+--------------------------------------+----------+-------+
| 07d954bf-3214-4df4-b640-48c27db2b1ed | Richmond | VA    |
| 98a75f88-eeaa-49ba-b464-2ac988a7b093 | New York | NY    |
+--------------------------------------+----------+-------+

目前它是一个 VB6 项目,我们只使用硬编码的 SQL 语句对使用临时#t 表的记录进行洗牌,并根据需要用现有值或新值填充 GUID 列。

我们已经转变为 C# .NET 商店,并且认为是时候将导入工具更新为 C#,因为当我们的新版本的目标数据库发生变化时,对工具进行更改变得越来越困难软件问世(这只是为了安装 Visual Studio 6 并在 Windows 8 上运行)。

我的问题

像 NHibernate 这样的 ORM 工具是否适合这项工作?我们之前都没有真正使用过 ORM(而且我们不是编写与新数据库进行日常使用的软件的开发团队,我们只是负责将旧数据库迁移到新数据库并且“真正的开发人员”告诉我们他们对每个版本的架构做了哪些更改)。我不太确定是否使用 ORM,因为我认为 ORM 用于客户端的 CRUD 操作,而不是像这样的服务器数据库迁移。

我认为“正确”的方法是使用 SSIS,但我部门中没有人熟悉它 and my supervisor feels让每个人都学习另一种语言来维护它会花费太多时间和资源(这个迁移工具是在我在另一个问题中谈到的步骤之后运行的)。

我正在寻找的主要是一种通过以下方式进行迁移的方法:

  • 大量数据
  • 允许在传输过程中设置某些列(例如重新使用外键 GUID)
  • 易于随着目标数据库架构的变化而变化
  • 最好使用 C# 或 SQL 完成。

我应该根据这些要求寻找什么样的工具?

我问这个问题是因为我认为 ORM 不是正确的做法,但我不确定应该使用什么来代替。除了 SSIS(因为太不同而被取消)之外,我不知道除了使用硬编码 SQL 语句之外还能做什么,但这打破了我心中的“易于更改”的要求。

最佳答案

毫无疑问,SSIS 是执行此操作的完美工具。

ORM 仅用于应用程序中的 CRUD 操作(正如您正确提到的),并且很可能会引起对大数据传输的严重关注。 大多数 ORM 甚至不建议用于涉及大量行的 CRUD 操作,忘记数据库级别的数据迁移。 ORM 主要用于简化软件应用程序和数据库之间持久数据连接的编码。

另一方面,SSIS 是为 ETL(提取转换负载)在数据库、数据仓库级别安全地创建的。与存储过程相比,迁移的发生率也明显更高。

我想补充的另一件重要事情是 SSIS 非常简单(根据我的经验)。大多数操作涉及在 Visual Studio 设计器上拖放 ETL 控件,然后在配置屏幕上配置数据类型。除非您真的喜欢编写代码,或者在极其复杂的场景中,否则您只需要编写代码和一些数据类型转换 (T) 片段就可以了。

我明白了,目前老板认为这是一项不必要的投资。然而,SSIS 是微软在数据仓库领域的王牌。查看您当前的要求,这正是您的组织所需要的。根据我们组织的经验,只要 Microsoft 存在,它就会被证明是一项值得每一分钱的投资。

关于c# - ORM 是用于迁移数据的正确工具吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17137840/

相关文章:

c# - 线程退出时如何处理 ThreadLocal 值?

c# - 以编程方式更改链接颜色

c# - 我可以使用 .NET SDK 添加/更新/删除策略配置吗?

.net - 在 .Net 中实现 MSSCCI 提供程序

javascript - laravel5删除,如何将2个参数传递给DELETE操作

c# - 如何动态检查数组中的索引是否存在?

c# - 为使用 IoC.Resolve() 的服务创建单元测试的最佳方法是什么

.net - 如何找到应用程序的.net框架?

c# - 无法将 JSON 反序列化为强类型对象

c# - SQL CROSS JOIN问题