C# ORM是迁移数据的正确工具吗?

C# ORM是迁移数据的正确工具吗?,c#,.net,sql,nhibernate,orm,C#,.net,Sql,Nhibernate,Orm,背景 我们正在升级一个遗留导入工具,它所做的是将数据从一个连接到SQL Server的数据库移动到同一服务器上的第二个数据库,该服务器使用不同的模式执行转换和映射 这里有一个例子来帮助解释发生了什么 假设源数据库有一个名为Client\u Info的表,目标表有两个名为Clients和Cities Source.dbo.Client\u Info +-----------+----------+----------+-------+ | FirstName | LastName | City

背景

我们正在升级一个遗留导入工具,它所做的是将数据从一个连接到SQL Server的数据库移动到同一服务器上的第二个数据库,该服务器使用不同的模式执行转换和映射

这里有一个例子来帮助解释发生了什么

假设源数据库有一个名为
Client\u Info
的表,目标表有两个名为
Clients
Cities

Source.dbo.Client\u 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 |
+-----------+-------------+--------------------------------------+
+--------------------------------------+----------+-------+
|               CityGuid               | CityName | State |
+--------------------------------------+----------+-------+
| 07d954bf-3214-4df4-b640-48c27db2b1ed | Richmond | VA    |
+--------------------------------------+----------+-------+
+-----------+-------------+--------------------------------------+
| FirstName |  LastName   |               CityGuid               |
+-----------+-------------+--------------------------------------+
| Scott     | Chamberlain | 07d954bf-3214-4df4-b640-48c27db2b1ed |
| John      | Smith       | 07d954bf-3214-4df4-b640-48c27db2b1ed |
| Jeff      | Walters     | 98a75f88-eeaa-49ba-b464-2ac988a7b093 |
+-----------+-------------+--------------------------------------+
+--------------------------------------+----------+-------+
|               CityGuid               | CityName | State |
+--------------------------------------+----------+-------+
| 07d954bf-3214-4df4-b640-48c27db2b1ed | Richmond | VA    |
| 98a75f88-eeaa-49ba-b464-2ac988a7b093 | New York | NY    |
+--------------------------------------+----------+-------+
Dest.dbo.Cities

+-----------+-------------+--------------------------------------+
| FirstName |  LastName   |               CityGuid               |
+-----------+-------------+--------------------------------------+
| Scott     | Chamberlain | 07d954bf-3214-4df4-b640-48c27db2b1ed |
+-----------+-------------+--------------------------------------+
+--------------------------------------+----------+-------+
|               CityGuid               | CityName | State |
+--------------------------------------+----------+-------+
| 07d954bf-3214-4df4-b640-48c27db2b1ed | Richmond | VA    |
+--------------------------------------+----------+-------+
+-----------+-------------+--------------------------------------+
| FirstName |  LastName   |               CityGuid               |
+-----------+-------------+--------------------------------------+
| Scott     | Chamberlain | 07d954bf-3214-4df4-b640-48c27db2b1ed |
| John      | Smith       | 07d954bf-3214-4df4-b640-48c27db2b1ed |
| Jeff      | Walters     | 98a75f88-eeaa-49ba-b464-2ac988a7b093 |
+-----------+-------------+--------------------------------------+
+--------------------------------------+----------+-------+
|               CityGuid               | CityName | State |
+--------------------------------------+----------+-------+
| 07d954bf-3214-4df4-b640-48c27db2b1ed | Richmond | VA    |
| 98a75f88-eeaa-49ba-b464-2ac988a7b093 | New York | NY    |
+--------------------------------------+----------+-------+
合并后,我希望目标是这样的

Dest.dbo.Clients

+-----------+-------------+--------------------------------------+
| FirstName |  LastName   |               CityGuid               |
+-----------+-------------+--------------------------------------+
| Scott     | Chamberlain | 07d954bf-3214-4df4-b640-48c27db2b1ed |
+-----------+-------------+--------------------------------------+
+--------------------------------------+----------+-------+
|               CityGuid               | CityName | State |
+--------------------------------------+----------+-------+
| 07d954bf-3214-4df4-b640-48c27db2b1ed | Richmond | VA    |
+--------------------------------------+----------+-------+
+-----------+-------------+--------------------------------------+
| FirstName |  LastName   |               CityGuid               |
+-----------+-------------+--------------------------------------+
| Scott     | Chamberlain | 07d954bf-3214-4df4-b640-48c27db2b1ed |
| John      | Smith       | 07d954bf-3214-4df4-b640-48c27db2b1ed |
| Jeff      | Walters     | 98a75f88-eeaa-49ba-b464-2ac988a7b093 |
+-----------+-------------+--------------------------------------+
+--------------------------------------+----------+-------+
|               CityGuid               | CityName | State |
+--------------------------------------+----------+-------+
| 07d954bf-3214-4df4-b640-48c27db2b1ed | Richmond | VA    |
| 98a75f88-eeaa-49ba-b464-2ac988a7b093 | New York | NY    |
+--------------------------------------+----------+-------+
Dest.dbo.Cities

+-----------+-------------+--------------------------------------+
| FirstName |  LastName   |               CityGuid               |
+-----------+-------------+--------------------------------------+
| Scott     | Chamberlain | 07d954bf-3214-4df4-b640-48c27db2b1ed |
+-----------+-------------+--------------------------------------+
+--------------------------------------+----------+-------+
|               CityGuid               | CityName | State |
+--------------------------------------+----------+-------+
| 07d954bf-3214-4df4-b640-48c27db2b1ed | Richmond | VA    |
+--------------------------------------+----------+-------+
+-----------+-------------+--------------------------------------+
| FirstName |  LastName   |               CityGuid               |
+-----------+-------------+--------------------------------------+
| Scott     | Chamberlain | 07d954bf-3214-4df4-b640-48c27db2b1ed |
| John      | Smith       | 07d954bf-3214-4df4-b640-48c27db2b1ed |
| Jeff      | Walters     | 98a75f88-eeaa-49ba-b464-2ac988a7b093 |
+-----------+-------------+--------------------------------------+
+--------------------------------------+----------+-------+
|               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
操作,而不是像这样的服务器数据库迁移

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

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

  • 大量数据
  • 允许在传输期间设置某些列(如重新使用外键GUID)
  • 易于随目标数据库架构的更改而更改
  • 最好用C#或SQL完成
对于这些类型的需求,我应该寻找什么样的工具


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

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


考虑到SSIS是不合适的(这是一个正确的选择,它是一个选择),我会考虑看。非常灵活,你可以使用<代码> SqLBulkPope<代码>,很明显你应该考虑在这里做。它太简单了。

SSIS是实现这一点的完美工具,可以直接使用

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

另一方面,SSI是为ETL(提取转换负载)而设计的,在数据库、数据仓库级别上是安全的。与存储过程相比,迁移的发生率也要高得多

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


我明白,老板现在认为这是不必要的投资。然而,SSIS是微软在数据仓库领域的王牌。从您当前的需求来看,这正是您的组织所需要的。根据我们公司的it经验,只要微软还活着,这项投资将证明是物有所值的。

我也不会使用成熟的ORM,但像Dapper这样的微型ORM对于此类任务(以及其他任务)来说是非常好的选择。如果您熟悉TSQL和c#这是一个简单的使用方法,那么它的运行速度非常快,而且非常接近金属,从而实现了高性能和易用性。 (您可以在15分钟内完成工作)

刚刚完成了一个类似的项目,使用它将数据从一个服务器移动到另一个服务器,它的工作和性能就像一个champ


不,ORM听起来不像是将数据从一个模式转换为另一个模式的正确工具。@MattBall我不这么认为,这就是促使我提出这个问题的原因。我学习了一个新术语ETL(提取转换负载),这就是我正在尝试做的事情,这些就是我需要寻找的工具。我会努力让SSI回到桌面上,脚本组件可以是C语言的,界面使用visual studio,大部分内容都是拖放式的。我同意@axawire,对于已经熟悉C#、Visual Studio和基本数据库的人来说,SSIS并不是一个巨大的学习曲线。唯一的“语言”是脚本对象,它可以在C#中完成。对于高级用途,需要更多的学习