在上一篇【数据库迁移利器:Migrator.Net】中,很多朋友提到了EF的CodeFirst也有数据库的迁移功能,说来真惭愧,玩了那么多年,至今还未去了解EF,今天来了解下CodeFirst然后与Migrator.Net进行下横向对比。

CodeFirst是EF提供的一种技术手段,使我们从以往的创建数据库后再创建模型变成了只需要关注代码方式进行创模,然后通过EF框架映射到数据库架构并生成。

CodeFirst除了创建新数据库之外,还提供了相应的迁移工具,通过升级和回滚操作相应的更新我们的数据库架构。这些方面都跟我之前介绍的Migrator.Net有异曲同工的作用。

创建新数据库并生成初始架构

通过NuGet直接引用EntityFramework,看下以下代码:

public class BlogContext : DbContext
{
public DbSet<Blog> Blogs { get; set; } public DbSet<Post> Posts { get; set; }
} public class Blog
{
public Blog()
{
Posts = new List<Post>();
} public int BlogId { get; set; } public string Name { get; set; } public virtual IEnumerable<Post> Posts { get; set; }
} public class Post
{
public int PostId { get; set; } public string Title { get; set; } public string Content { get; set; } public virtual Blog Blog { get; set; }
}

我们创建了Blog和Post模型,通过在BlogContext中注册这2个模型,通过以下代码:

class Program
{
static void Main(string[] args)
{
using (var db = new BlogContext())
{
db.Database.Initialize(true);
} Console.WriteLine("Press any key to exit...");
Console.Read();
}
}

运行程序后,我们来看下数据库的变化。这里要说下,在我们数据库连接都没有配置的情况下,默认情况下VS2012使用LocalDB,VS2010使用SqlExpress。LocalDB不支持SqlServer Management Studio进行连接。

使用VS2012的数据连接,我们能看到我们的数据库已经创建,数据库名为命名空间.Context名,这里是CodeFirstMigrator.BlogContext

看下数据库中有哪些东西:

Blogs和Posts表就是EF为我们创建的2个模型表,_MigrationHistory就是版本的信息

_MigrationHistory表与Migrator.Net的SchemaInfo表类似,都保存着版本信息,不过_MigrationHistory存储的数据更多一些。

更新表字段

我们为Blog模型添加一个Url属性,然后再运行程序,我们发现会报错:

CodeFirst默认情况下,只能为重新创建数据库和表,并不能更新已存在的数据库,我们必须使用CodeFrist的Migrations功能创建迁移版本,再去更新数据库。

首先需要为Context创建迁移

在程序包管理控制台中运行:Enable-Migrations

运行后,会在我们的项目解决方案中生成Migrations目录

InitialCreate.cs就是我们初始需要创建的脚本,Configuration是一些迁移配置。我们看下InitialCreate的代码:

public partial class InitialCreate : DbMigration
{
public override void Up()
{
CreateTable(
"dbo.Blogs",
c => new
{
BlogId = c.Int(nullable: false, identity: true),
Name = c.String(),
})
.PrimaryKey(t => t.BlogId); CreateTable(
"dbo.Posts",
c => new
{
PostId = c.Int(nullable: false, identity: true),
Title = c.String(),
Content = c.String(),
Blog_BlogId = c.Int(),
})
.PrimaryKey(t => t.PostId)
.ForeignKey("dbo.Blogs", t => t.Blog_BlogId)
.Index(t => t.Blog_BlogId); } public override void Down()
{
DropForeignKey("dbo.Posts", "Blog_BlogId", "dbo.Blogs");
DropIndex("dbo.Posts", new[] { "Blog_BlogId" });
DropTable("dbo.Posts");
DropTable("dbo.Blogs");
}
}

发觉了没,跟Migrator.Net及其相像,通过继承DBMigrator类,重写Up和Down方法实现升级或者回滚的响应操作。

回到之前更新的操作,我们使用程序包控制台程序输入:Add-Migration AddBlogUrl

红色为版本命名,需要唯一。

我们在控制台再输入:Update-Database

通过Update-Database后,会更新我们的数据库架构,如图:

响应的Blogs表 和_MigrationHistory表都会有所变化。

迁移到特定版本(回滚)

CodeFirst通过控制台输入Update-Database –TargetMigration: 版本名称 进行指定版本的迁移,例如我们回滚到初始创建时:Update-Database –TargetMigration:InitialCreate

我们不需要切换到cmd控制台,直接在VS中就能进行操作,这点还是很方便的。

其他环境进行迁移操作

如果需要再其他开发环境中搭建数据库的话,只需要获取最新的项目代码,使用Update-DataBase命令就可以了。如果需要实践到应用环境,则需要通过Update-Database -Script -SourceMigration: $InitialDatabase -TargetMigration: 版本名称 生成Sql脚本,提供给DBA进行数据库操作。

您也可以在项目运行开始添加如下操作:

Database.SetInitializer(new MigrateDatabaseToLatestVersion<BlogContext, Configuration>()); 

此操作会自动更新数据库架构到最新版本。

与Migrator.Net对比

作为数据库迁移工具来讲,大家都差不多,都能实现数据库架构的迁移,原理也很相近,不过CodeFirst因为是含在EF中,有了微软的支持在VS中使用,而且迁移代码都是自动生成,这个方面大大提高了开发进度。而Migrator.Net一般会新建一个类库,专门作为迁移用,但因为迁移代码都是我们自己完成,所以对码农来说会更新明了。如果数据库复杂度不高的话,随便用哪个都可以,但一般我们的项目会越来越庞大,数据库的更改也会越来越频繁,这时候CodeFirst就会落后于Migrator.Net,CodeFirst会根据您控制台命令Add-Migration生成从之前版本到现在的所有更改,而Migrator.Net则因为我们自己来编写的,会清晰明了,对迁移来说也会更好(个人想法,可能还未深入了解的关系吧)。

 

CodeFirst

Migrator.Net

数据库类型支持

默认支持SqlServer,LocalDB,SqlExpress

通过自己编写代码也能支持其他数据库

默认支持:MSSQL,MySql,Sqlite,oracle,PostgreSql

与VS集成

集成度高

无集成

迁移工具

通过生成SQL脚本

命令行工具

通过项目代码进行自动迁移

通过命令行迁移

也可以在项目中进行自动迁移

复杂度

开发简单,迁移脚本自动生成

开发一般,迁移脚本自己编写

项目耦合度

耦合度高,因为是自动生成迁移脚本,需要依赖实体类和上下文。

无耦合,迁移脚本自己编写,不需要了解我们的实体类

数据库特性支持

基本支持,遇到特别字段,可通过修改生成的迁移脚本进行修改

基本支持

创建新数据库

可自动创建

需手动创建

两个功能相似,但在使用上还是各有千秋,做为一个架构师来说,我更偏向于使用Migrator.Net,因为CodeFirst是EF的一种功能,我们的项目有时候不是必须使用EF的。

EF发展到现在已经到6.1版本,肯定已经很强大了,但种种原因至今还未接触过,不知其强大的功能,今后有机会还是希望接触一下。

CodeFirst 参考资料:

对新数据库使用 Code First

约定

Code First 迁移

自动化 Code First 迁移

Migrate.exe

了解EF CodeFirst的Migrator功能与Migrator.Net对比的更多相关文章

  1. [.NET领域驱动设计实战系列]专题一:前期准备之EF CodeFirst

    一.前言 从去年已经接触领域驱动设计(Domain-Driven Design)了,当时就想自己搭建一个DDD框架,所以当时看了很多DDD方面的书,例如领域驱动模式与实战,领域驱动设计:软件核心复杂性 ...

  2. 新年奉献MVC+EF(CodeFirst)+Easyui医药MIS系统

    本人闲来无事就把以前用Asp.net做过的一个医药管理信息系统用mvc,ef ,easyui重新做了一下,业务逻辑简化了许多,旨在加深对mvc,ef(codefirst),easyui,AutoMap ...

  3. 新年奉献MVC+EF(CODEFIRST)+EASYUI医药MIS系统(转)

    出处:http://www.cnblogs.com/chenlinzhi/p/4332628.html 本人闲来无事就把以前用Asp.net做过的一个医药管理信息系统用mvc,ef ,easyui重新 ...

  4. 1.【使用EF Code-First方式和Fluent API来探讨EF中的关系】

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/relationship-in-entity-framework-using-code-firs ...

  5. [转]Using Entity Framework (EF) Code-First Migrations in nopCommerce for Fast Customizations

    本文转自:https://www.pronopcommerce.com/using-entity-framework-ef-code-first-migrations-in-nopcommerce-f ...

  6. EF CodeFirst 如何通过配置自动创建数据库<当模型改变时>

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精    本篇为进阶篇,也是弥补自己之前没搞明白的地方,惭愧 ...

  7. EF CodeFirst增删改查之‘CRUD’

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精    本篇旨在学习EF增删改查四大操作 上一节讲述了EF ...

  8. EF CodeFirst 创建数据库

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精    话说EF支持三种模式:Code First   M ...

  9. EF Codefirst 初步学习(二)—— 程序管理命令 更新数据库

    前提:搭建成功codefirst相关代码,参见EF Codefirst  初步学习(一)--设置codefirst开发模式 具体需要注意点如下: 1.确保实体类库程序生成成功 2.确保实体表类库不缺少 ...

随机推荐

  1. AMD and CMD are dead之KMDjs在JS工程化的努力

    总览 kmdjs发布了最接近最终版本的0.0.4版本https://github.com/kmdjs/kmdjs,你已经完全可以在项目中使用.我已经无法用语言形容其完美程度.借用我发的微博:   模块 ...

  2. Struts2(1) —— 概述

    1.Struts2框架介绍 Struts2框架是MVC流程框架,适合分层开发,框架应用实现不依赖于Servlet,使用大量的拦截器来处理用户请求,属于无侵入式的设计. 2.Struts2框架的流程原理 ...

  3. Javascript中构造函数与new命令

    典型的面向对象编程语言(比如C++和Java),存在“类”(class)这个概念.所谓“类”就是对象的模板,对象就是“类”的实例.但是,在JavaScript语言的对象体系,不是基于“类”的,而是基于 ...

  4. jquery简介和实例

    一.简介 定义 jQuery创始人是美国John Resig,是优秀的Javascript框架: jQuery是一个轻量级.快速简洁的javaScript库. 参考:http://www.php100 ...

  5. Android客户端与Eclipse服务器端的Socket通信

    Server端代码 用来实现客户端socket的监听 package MyServer; import java.io.BufferedReader; import java.io.BufferedW ...

  6. CocoaPods 导入第三方库头文件自动补齐

    使用了一段时间CocoaPods来管理Objective-c的类库,方便了不少.但是有一个小问题,当我在xcode输入import关键字的时候,没有自动联想补齐代码的功能,需要手工敲全了文件名,难以适 ...

  7. python之(re)正则表达式上

    python正则表达式知识预备 正则表达式使用反斜杠" \ "来代表特殊形式或用作转义字符,这里跟Python的语法冲突,因此,Python用" \\\\ "表 ...

  8. 5、软件架构师要阅读的书籍 - IT软件人员书籍系列文章

    软件架构师在项目中的地位是不言而喻的,其对于项目的需求要相对比较了解,然后对项目代码的结构需要做到覆盖全面.本文就说说作为一个软件架构师需要阅读的一些书籍. 当然,这些书籍都来源于网络,是笔者收集整理 ...

  9. Oracle 释放flash recovery area的四种方法

    早上收到一台Linux服务器磁盘告警邮件以及监控告警日志程序发来的邮件.检查过后,发现Linux服务器中一个分区没有空间了.主要原因是由于昨晚程序员做升级时,产生了大量的归档日志,导致联机重做日志无法 ...

  10. ORACLE Linux以及 Unbreakable Enterprise Kernel

    Oracle Linux,全称为Oracle Enterprise Linux,简称OEL,Linux发行版本之一.Oracle公司在2006年初发布第一个版本,以对Oracle软件和硬件支持较好见长 ...