QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

在.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:521311
用户头像

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

关注

评论

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

如何实现文件共享,文件共享的设置方法

镭速

代码实现RabbitMQ死信队列的创建

北桥苏

php RabbitMQ 消息队列 死信队列

浅谈一下ThinkPHP5.1实现事务嵌套的特性

北桥苏

php thinkphp 事务回滚

手势识别:解放双手,开启智能时代

来自四九城儿

数据采集在现代科技中的应用与挑战

来自四九城儿

关于Appium2.0

IT蜗壳-Tango

三周年连更

inBuilder低代码平台开发者分享课丨变量命名要义

inBuilder低代码平台

开发者 低代码 变量

敏态开发在大兴机场数字化转型中的实践

明道云

C++ 模板

雪奈椰子

如何在uni-app中使用fingerprint2实现游客设备标识

北桥苏

JavaScript 前端 uniapp fingerprint

MySQL如何做如等级/成色等特殊顺序的排序

北桥苏

MySQL sql 排序算法

全国标杆!3DCAT实时云渲染助力深圳移动5G+智慧校园建设

3DCAT实时渲染

虚拟现实 虚拟仿真 实时渲染云

mac屏幕分辨率调整用什么软件好呢?

真大的脸盆

Mac Mac 软件 屏幕分辨率调整

详细版Jmeter随机参数的接口并发测试总结

北桥苏

Jmeter

自学C4D,不要错过这些教程

Finovy Cloud

大数据如何助力营销(2)用户画像

MobTech袤博科技

企业移动数字化平台如何赋能企业管理升级?

BeeWorks

PHP如何通过rabbitMQ死信队列实现业务的延时/定时操作

北桥苏

php RabbitMQ

TiDB x CAPCOM | 为在线游戏提供灵活、可靠、可扩展的数据库服务

PingCAP

关于在 MySQL 排序中使用索引这件事!

江南一点雨

MySQL 数据库

白鹭游戏引擎网络棋牌搭建步骤

北桥苏

php 游戏开发 白鹭引擎

关于使用ElascticSearch的两个小技巧

北桥苏

php elasticsearch

永远不该忘记!科技才是硬道理,手中没有剑,跟有剑不用,是两回事

加入高科技仿生人

人工智能 ChatGPT 文心一言 通义千问 科学技术

以PHP门面模式实现简单的邮件发送

北桥苏

php 设计模式 门面模式

phpOffice实现Excel表格导入的解耦方法

北桥苏

php PhpOffice/PhpSpreadsheet

websocket测试工具的环境搭建与使用

北桥苏

Jmeter webscoket

大模型应用产品落地!提升理财师展业效果

中关村科金

Mac打不开后缀名为txt文件,显示文本编码中文不适用

互联网搬砖工作者

为什么企业选择局域网即时通讯软件?局域网即时通讯软件哪家好?

BeeWorks

解决使用宝塔安装的swoole扩展,运行项目出现的3个常见问题

北桥苏

php 游戏开发 swoole

PHP通过Modbus Tcp实时获取设备数据

北桥苏

物联网 PLC Modbus Tcp

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