了解EF CodeFirst的Migrator功能与Migrator.Net对比

在上一篇【数据库迁移利器: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

时间: 2024-09-20 05:41:27

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

MVC3教程之实体模型和EF CodeFirst

在本节中,我们将使用Entity Framework 数据访问技术来定义这些模型类,并对这些类来进行操作.EF支持一个被称之为"code-first"的开发范例.Code-first允许你通过书写一些简单的类来创建模型对象,而不用关心这些类的持久化.你可以通过访问这些类的方式来访问数据库,这是一种非常方便快捷的开发模式. 1.添加一个Model 添加Model和添加普通类的操作是一样的,默认的约定是将它放在Models文件夹中.我们在Models文件夹上面点击右键,选择"添加

mvc4-Appharbor 平台 使用 EF codefirst 数据迁移后出现异常!

问题描述 Appharbor 平台 使用 EF codefirst 数据迁移后出现异常! 我在Appharbor 上面使用了免费的sql server 数据库链接使用的是 EF5 codefirst,刚刚给一个表添加了一列,然后数据迁移之后,这个数据库就不知道怎么回事用不了了. 这个是网站上的显示,问题我标注上去了: 本地sqlserver management也连不上了: 大半夜的急死了...各位大牛谁帮我看看不知道我提供的数据够不够,不够告诉我我再找 楼主今年刚毕业,做外包比较忙也很可怜,只

远程桌面连接的多媒体重定向功能介绍及性能对比

  故障现象: 远程桌面连接的多媒体重定向功能介绍及性能对比. 解决方案: 远程桌面连接的多媒体重定向功能在客户端和主机端都支持时启用,其主要作用为在主机端播放的文件在客户端进行解码播放,而不是直接传送bitmap.其主要优势在于: 1. 节约带宽资源. 2. 节约主机的CPU资源. 具体效果对比,参照下图:

Asp.Net MVC +EF CodeFirst+多层程序设计

这是一个基于个人博客的一个项目,虽然博客根本没必要做这么复杂的设计.但是公司有需求,所以先自己弄个项目练练手.项目需要满足下列需求 1.层与层之间需要解耦,在后期上线更新维护时不需要覆盖,只需要更新局部dll即可,也就是插件机制 2.代码安全性,公司有找外包公司要些人,但是又不想让他们得到所有代码,就需要利用接口来规范开发. 3.一开始没有完整的需求说明和数据库设计文档.我们是轻文档开发,也就是说在没有完全上线之前需求随时可能更改,而且数据库一开始也没有设计好,而是开发一点添加一点,也随时会更换

EF codefirst 开发环境与部署环境 如何更新数据库

问题描述 用EF的codefirst方式开发了一个网站.数据库的字段增加都是通过code去完成的,然后做数据库迁移.用生成数据库表dbo.__MigrationHistory的方法,在configuration.cs中设置AutomaticMigrationsEnabled=true;可以利用包管理工具然后命令:Update-database-verbose-force解决了每次修改数据库字段就重新dropdb,createdb的烦恼.but.....在部署好的网站中,怎么解决程序变了,需要改变

EF Code-First CRUD操作

网上很多的教程都是跟MVC3绑在一起来讲解的,如果我们抛开MVC3,该如何使用呢? 首先新建一个控制台应用程序,我们把它命名为:EFCodeFirst-Books 第二步,添加EntityFramework的引用. 不要说你还不回使用NuGet,如果真的不会就去问度娘.在NuGet 控制台输入Install-Package EntityFramework,NuGet会为我们引用最新发布的EF版本,目前的版本是4.3. 第三步,添加实体类. 我新建了一个Models文件夹,在里面添加了Book类,

EF CODEFIRST 如何调用自定义函数

问题描述 RT有一个自定义标量值函数,主要用在查询语句中的Where条件内如Select*FromAWheredbo.CustomFunc(A.ID)=1请教如何在CodeFirst中使用(比如形式如SqlFunctionsCharIndex可以这么用q.Where(x=>SqlFunctionsCharIndex(x.ID)=1) 解决方案 解决方案二:参考:http://msdn.microsoft.com/zh-cn/library/dd456847.aspx解决方案三:该回复于2012-

请教EF CodeFirst问题 急!!!!!!

问题描述 1.在配置文件里(App.Config)里设置<connectionStrings><addname="DBase_"connectionString="DataSource=localhost;port=3306;Database=AbroadRegisterSystem;userid=root;password=123456;"providerName="MySql.Data.MySqlClient"/>&l

ASP.NET MVC分页和排序功能实现_实用技巧

分页和排序,应该是软件开发中,需要必知必会的技能了,对于分页,网上很多教程,当然,别人终究是别人的,只有自己理解,会了,并且吸收之后,再用自己的语言,传授出来,这才是硬道理.好了,废话说多了.现在我们进入正题:  这里,我打算使用EF Code-First方式分页控件就是用PagedList.MVC,来做分页,对于排序,实现的思路是,加载数据出来之后,默认是升序排序,然后我们点击一下相应的列标题,就按照该字段降序排序,查数据.思路明确了,就开始干吧!  1.首先新建一个空白的MVC项目,在Mod