写点什么

在.NET 中使用 Rails 风格的数据库迁移方式

  • 2009-01-21
  • 本文字数:962 字

    阅读完需:约 3 分钟

维护可变的代码库,尤其是进行持续集成的关键,便是与.NET 代码一起对数据库架构进行版本控制。许多使用.NET 的项目组都使用手写的脚本或架构自动比对工具。Ruby on Rails 使用了一个流行的解决方案来处理这个工作,它将 DDL SQL 语句抽象为 Ruby 命令,这个工具便是 migrations

下面为一段使用 Ruby 编写的 Rails 迁移代码,定义了一个创建和删除数据库中 Users 表的行为:

Rails Migration

使用 RikMigrations 类库就可以使用 C#编写类似的代码:

RikMigration in C#

这里最重要概念是,所有定义数据库脚本的 DDL 都被抽象并添加至应用程序代码中了。这样做有以下几点优势:

  • 数据库平台无关:将 DDL 抽象为.NET 方法之后,开发人员可以只编写一次创建表格的脚本,迁移类库便会将.NET 代码转化为不同数据库平台的脚本。这样就无须为 Oracle 准备一份安装脚本的同时再为 SQL Server 准备一份了。
  • 可集成版本控制:如果迁移代码能够和应用程序代码一起放进项目源码管理仓库,那么就能为迁移代码轻易地创建分支或打上标签,以确保任何版本的代码库都可以构建一份一致的数据库。
  • 自动升级或降级:一个迁移一般有一个 Up 方法和 Down 方法。Up 方法定义了修改数据库的行为(例如创建数据表),而 Down 方法定义了回滚这次操作的行为(如删除数据表)。如果迁移工作与其它代码一并被版本化了,那么您就可以通过执行一个升级路径,自动将一个旧的数据库升级到当前状态。

.NET 社区尚未广泛采用这种类迁移方式,除了对这种做法不熟悉之外,还有一些其他因素阻碍了它的推广。比如许多.NET 项目组都使用大量数据库的存储过程;对脚本进行版本化管理可能更适合使用存储过程的系统,同时平台无关性也并非那么重要了;此外,对于由独立 DBA 进行数据库管理的大型应用程序,把 DDL 放入.NET 代码的做法往往并不可行。

目前有两个.NET 迁移类库在社区中发展良好: RikMigrations 代码)和 Migrator.NET 。RikMigrations 是一个更为流行的类库,支持一个更为友好的界面和命令行接口。不过,它的主要开发者在去年中期就已经停止更新代码。Migrator.NET 目前则慢慢流行开来,它的新界面和自动集成功能也愈发成熟。两者都是轻巧的开源项目,开发人员可以对其提供更多支持。

Justion Etheredge 是一个 C# MVP,他写了一个有用的RikMigrations 入门向导,其中也包括一些配置要点。

查看英文原文: Rails Style Database Migrations in .NET

2009-01-21 22:521508
用户头像

发布了 157 篇内容, 共 59.2 次阅读, 收获喜欢 6 次。

关注

评论

发布
暂无评论
发现更多内容

MyBatis入门

小马哥

Java mybatis 七日更 2月春节不断更

CDN加速原理的那些事

智能汽车颠覆世界!(28天写作 Day28/28)

mtfelix

28天写作 智能汽车 未来世界

2021最新最全面“Java知识总结+⾯试指南”强烈推荐!

比伯

Java 编程 架构 面试 技术宅

数据主权,才是业务在线化的核心

boshi

数据 数字资产 七日更

Linux 文件搜索神器 find 实战详解,建议收藏!

鞋子特大号

Linux find

深入Linux内核之自旋锁spinlock_t机制

赖猫

c++ Linux内核

写在“28天坚持写作活动”的最后一天

JiangX

28天写作

开发质量系列:系统运营必须派人常驻机房吗?

罗小龙

最佳实践 方法论 28天写作 2月春节不断更

28天写作复盘

一笑

28天写作

“嗖”一下28 天过去啦,我们都在交作业!

李忠良

28天写作

如果非要在多线程中使用ArrayList会发生什么?

看山

线程安全

【Linux系统】一个常驻进程问题的再次分析

程序员架构进阶

Linux 七日更 28天写作 2月春节不断更 共享内存

怎么一本正经地秀技

codevald

Java jdk

Linux Lab 进阶: Linux 内核

贾献华

Linux Linux Kenel 内核

产品训练营第二周作业-利益相关者

马悦

产品 产品经理训练营

产品经理第四周

克比

有用的信息安全资质查询网站大全

石君

信息安全 28天写作

ThreadLocal 类以及应用技巧

武哥聊编程

Java 多线程 ThreadLocal 28天写作

【LeetCode】子数组的最大平均数

Albert

算法 LeetCode 2月春节不断更

28天瞎写的第二百三十八天:这一年干了啥?

树上

28天写作

谈谈我所理解的科幻「-28/28」

道伟

28天写作

《我们一起学集合》-LinkedList

蚊子

Java 数据结构 面试 集合 linkedlist

管理笔记[8]:管理中的聚势、借力与计划

L3C老司机

机器学习笔记之:Matrix Vector Multiplication

Nydia

下不了的开人的手

Ian哥

28天写作

养成好习惯,需要的不只是意志力

Justin

习惯养成 碎碎念 28天写作

面试时遇到一致性哈希算法这样回答会让面试官眼前一亮

中间件兴趣圈

负载均衡 面试 一致性哈希

阿里Java面试脑图遭公开,GitHub上已获赞79.6K

Java架构师迁哥

黑客练手入门| pwnable.kr—幼儿瓶—02:collision

BigYoung

安全 CTF PWN 28天写作 2月春节不断更

28天写作

lidaobing

28天写作

在.NET中使用Rails风格的数据库迁移方式_.NET_Al Tenhundfeld_InfoQ精选文章