Migration是一种分布环境下的数据库同步工具,出现在Ruby on Rail框架里,MigratorDotNet是一个.NET类似于Ruby on Rail的Migrations的数据库版本系统。支持的数据库有MySQL (5.0, 5.1) ,PostgreSQL ,SQLite ,SQL Server (2000, 2005),Oracle (没有经过很好测试),可以通过NantTask,MSBuildTarget, Console Application三种方式来使用。
Migration是一种分布环境下的数据库同步工具,出现在Ruby on Rail框架里,MigratorDotNet是一个.NET类似于Ruby on Rail的Migrations的数据库版本系统。支持的数据库有MySQL (5.0, 5.1) ,PostgreSQL ,SQLite ,SQL Server (2000, 2005),Oracle (没有经过很好测试),可以通过NantTask,MSBuildTarget, Console Application三种方式来使用。
Migrations的类是Migration的子类,Migration主要有两个方法:Up方法定义这个版本该做什么,Down定义怎么回滚版本.
每一个Migration都应该是数据库中一个非常小的增量修改,常用的尺寸是创建一个表和给表增加一个字段或者多个字段,修改表的数据和对表执行一个ExecuteQuery自定义查询。保持Migration的尽量小,这样方便在版本之间的迁移,就在版本控制系统SVN,TFS那样,Migration的例子是这样的:
// Version 1
[Migration(1)]
public class CreateUserTable : Migration
{
public void Up()
{
Database.CreateTable("User",
new Column("UserId", DBType.Int32, ColumnProperties.PrimaryKeyWithIdentity),
new Column("Username", DBType.AnsiString, 25)
);
}
public void Down()
{
Database.RemoveTable("User");
}
}
Migration属性使用一个整数来表示,代表当前的数据库版本,工具就是通过这个属性来决定数据库之间的迁移。你如果使用控制台程序,版本号作为参数传给控制台程序,当然你也可以使用NAnt脚本或者MSBuild脚本。
下面是一段NAnt编译脚本:
<?xml version="1.0" ?>
<project default="migrate">
<property name="project.dir" value="."/>
<property name="output.dir" value="${project.dir}\Output" />
<loadtasks assembly="${project.dir}\lib\migrator\Migrator.NAnt.dll" />
<target name="clean" description="Deletes the previously built directories">
<delete dir="${output.dir}" failonerror="false" />
</target>
<target name="build" description="Builds Migration Project" depends="clean">
<msbuild project="${project.dir}\src\Migrations.Project\Migrations.Project.csproj">
<property name="Configuration" value="Debug" />
<property name="OutDir" value="${output.dir}\\" />
</msbuild>
</target>
<!-- Database Migrations task -->
<target name="migrate" description="Migrate the database" depends="build">
<!-- Using a version of -1 will cause the migration to migrate to the latest version -->
<property name="version" value="-1" overwrite="false" />
<migrate
provider="MySql"
connectionstring="Database=mydb;Data Source=localhost;User Id=mysqluser;Password=mysqlpassword;"
migrations="${output.dir}\Migrations.Project.dll"
to="${version}" />
</target>
</project>
如何写Migrate可以参看WritingMigrations。另外提一下SubSonic 2.1 RC1版本也增加Migrate功能,具体参看SubSonic: Using Migrations
数据库移植参考资料:
http://api.rubyonrails.com/classes/ActiveRecord/Migration.html
http://wiki.rubyonrails.org/rails/pages/UnderstandingMigrations
http://wiki.rubyonrails.org/rails/pages/UsingMigrations
Getting Started with Migrator.NET
http://www.lostechies.com/blogs/sean_chambers/archive/2008/06/04/getting-started-with-migrator-net-and-database-refactorings.aspx
(outdated) http://macournoyer.wordpress.com/2006/09/20/database-migration-for-net
Where did Migrator.NET come from
http://macournoyer.wordpress.com/2007/09/18/the-migrations-for-net-project-is-not-dead-yet
Migrator.NET Good Practices
http://macournoyer.wordpress.com/2007/02/11/agile-database-fun-with-the-migrator
Migrate NAnt Task
http://macournoyer.wordpress.com/2006/10/15/migrate-nant-task
Database Migrations for .NET
http://www.zorched.net/2008/04/20/database-migrations-for-net/