2013-05-30 45 views
10

有人能解释迁移者(特别是fluentmigrator)的概念?迁移者(FluentMigrator)的说明?

这里是(可能混淆)事实伊夫收集关于这个问题:

  • 是它最初由版本的方式数据库 创建然后保持更新的方式。

  • 第一迁移(或 数据库的初始版本)将包含所有的表,关系和属性 需要(无论是做流利或在脚本中使用SQL的块)。

  • 当您想要将更改推送到数据库时,您将创建一个新的 迁移方法(向上和向下),如添加新表或修改字段。

  • 要部署这些迁移的一个,你可以使用一个 命令行指定包含在迁移中, 连接字符串和所需的版本的DLL。

如果您有一套相当复杂的数据模型,创建所有这些迁移定义是否相当困难和耗时?

我知道与NHibernate /流利,你可以很容易地生成一个数据库表,而不必定义比模型和地图文件的其他任何东西。有没有办法使这个配置与Migrator/Versioning兼容?

当NHibernate的/流利负责生成数据库的,我不一定需要来定义表的每一件事情方面。它通过约定或通过映射文件完成。通过移民,我需要定义这个级别的细节?

回答

19

很多问题在这里。我将回答这些问题,重点关注FluentMigrator。

这是一种通过版本控制的方式初始创建并维护数据库的更新 。

FluentMigrator是一种版本控制数据库架构的方法。每个人都以某种方式做它。手动,使用sql脚本,使用SqlCompare或Visual Studio数据库项目等工具。所有这些方法都很容易搞砸。当发布新版本并导致系统崩溃时,很容易出错。迁移是处理此问题的更好方法。

FluentMigrator允许您定义更改架构的代码,这通常是签入到与其他代码更改源代码控制。这意味着你可以说系统的版本1.XX应该有数据库的版本123。这意味着如果您将代码回滚到以前的版本,您也会知道要回滚到哪个版本的数据库。

它既可以用来从头创建数据库模式,也可以从现有数据库的模式版本控制开始。

迁移是一种描述数据库模式更改的方法。FluentMigrator创建一个VersionInfo表,并存储迁移后的唯一标识(版本号)。

例如,如果我有两个迁移一个与Id 1和一个与Id 2.如果然后我执行第一个迁移然后Id 1将存储在VersionInfo表中,我可以看看那里,知道版本该数据库为1,该版本2尚未应用。

能够知道哪个版本的数据库模式在推送从测试到生产的更改时非常有用,或者您在生产中有多个数据库副本。例如,我有一个在世界各地都设有办事处的客户,每个办事处都有自己的数据库副本,而且他们都是不同的版本。在不知道数据库版本的情况下,安全地更新它们将非常困难。

大多数情况下,我不需要真正查看VersionInfo表格,FluentMigrator会自动处理它。它将程序集与Migrations进行比较,并确定尚未应用哪些更改,然后执行这些更改。

第一迁移(或数据库的初始版本)将包含所需 所有表,关系和属性(在脚本做到无论 流利或使用SQL的块)。

起点取决于您。您可以进行第一次迁移,该迁移是从当前数据库中生成的sql脚本。您也可以使用其中一个像这样的contrib项目来生成Fluent迁移。或者你可以决定现有的数据库是一个起点,并保存它的一个副本,以便将其恢复为版本1.

我已经将FluentMigrator引入了很多遗留数据库,没有出现任何重大问题。

当你想要把更改的数据库,你会创建一个新的 迁移方法(上下),像添加新表或 修改字段。

是的,Up用于应用在Migration和Down中指定的更改将其返回。所以Up可以创建一个表格,Down可以放置表格。

要部署这些迁移的一个,将使用指定包含迁移,连接字符串和 所需版本的dll命令行 。

有三个runners可用于执行迁移。命令行运行程序,Nant任务和MSBuild任务。通常作为构建脚本的一部分执行。

MigrationRunner类也可以在代码中使用。你可以这样做,如果你想建立自己的亚军或者如果您有其他需求(如动态构建数据库或自动如果添加了新的迁移更新数据库。)

如果你有一个相当复杂的数据模型,这难道不是 困难且耗时的创建所有 的迁移定义吗?

我已经主要回答了这个问题。为数据库生成一个sql脚本通常很容易。对于Sql Server,即使对于大型数据库,也只需不到一分钟即可生成脚本。该脚本可以保存在.sql文件中,并使用Execute.EmbeddedSqlScript表达式作为第一次迁移来执行。它工作的一种享受。

我知道与NHibernate /流利,你可以很容易地生成一个 数据库表,而不必定义比模型和 地图文件的其他任何东西。有没有办法使此配置与迁移器/版本控制的 兼容?

目前没有这样的整合,实际上我至少不会错过它。关于连接Fluent NHibernate和FluentMigrator有一些讨论,但这将是很多工作。它可以使脚手架产生对EF Code First迁移所做的模型更改。然而,目前这还不是路线图。

当nhibernate/fluent负责生成数据库时,我不需要定义表的每个东西方面。它通过约定或通过映射文件完成 。与移民我 将需要定义此级别的细节?

是的,您需要定义该详细程度。 FluentMigrators的迁移是一种DSL(自己的小语言),用于定义转换为sql的模式更改。你也可以使用Execute.Sql表达式直接编写sql。实体框架迁移具有这种兼有优点和缺点的整合。

退房的wiki或教程之一herehere(第1部分)或更多的帮助here(部分2)开始。