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

时间:2013-06-16 21:20:46

标签: 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语句之外该做什么,但这打破了我脑海中“易于改变”的要求。

3 个答案:

答案 0 :(得分:2)

SSIS是完成此任务的完美工具,请放手。

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

另一方面,SSIS是在数据库,数据仓库级别安全地进行ETL(Extract Transform Load)。与存储过程相比,迁移的速度也明显更高。

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

据我所知,老板认为这是一项不必要的投资。但是,SSIS是微软在数据仓库领域的王牌。查看您当前的需求,这正是您的组织所需要的。根据我们组织的经验,只要微软生活,这项投资将证明每一分钱都值得。

答案 1 :(得分:2)

我也不会使用完整的ORM,但像Dapper这样的微型ORM非常适合这样的任务(除此之外)。如果您熟悉TSQL和c#,它可以非常快速地运行,非常接近金属,以获得高性能和易用性。 (你可以在15分钟内提高效率)

刚刚完成了一个类似的项目,使用它将数据从服务器移动到服务器,它可以像冠军一样工作和执行。

https://code.google.com/p/dapper-dot-net/

答案 2 :(得分:1)

ORM绝对不是正确的工具,因为您正确指出它们适用于OLTP应用程序。

鉴于SSIS不在桌面上(正确选择它是一个选项),我会考虑查看Rhino ETL。非常灵活,你可以使用SqlBulkCopy,显然你应该考虑在这里做。它是open source,太启动了。