CodeFirst迁移

[删除(380066935@qq.com或微信通知)]

更好的阅读体验请查看原文:https://www.jianshu.com/p/e858f9bf1aaa

关于Code First 迁移其实就是我们在更改模型的时候,数据库要相应的更改。

  1. 例如我们上面创建NewTypes表的时候,没有指定字段的长度,默认是创建字段类型是nvarchar(MAX),有时候我们觉得字段长度太长,需要修改一下字段长度,不要直接去修改数据库,而是在模型中修改:
[MaxLength(50)]
public string Name { get; set; }

MaxLength就是上面我们说到DataAnnotations命名空间下的类型,这边我们注意下,我们在生成数据库的时候添加了一条数据,Name字段值是“2017年大吉”,看看我们修改字段长度后,字段值是否发生变化?

  1. 在程序包管理器控制台输入Enable-Migrations命令来启用迁移,运行完成后在项目中会创建一个Migrations文件夹,下来有两类文件:
  • Configuration.cs — 此文件包含“迁移”将用来迁移 BloggingContext 的设置。在本演练中不需要进行任何更改,但是,在此处可以指定种子数据、为其他数据库注册提供程序、更改生成迁移的命名空间等。
  • <时间戳>_InitialCreate.cs — 这是第一个迁移,它表示已经应用于数据库的更改。应用更改的目的是将其从空数据库迁移至包含博客和文章表的数据库。尽管我们让 Code First 自动创建这些表,现在我们选择“迁移”(已转化为一次“迁移”)。Code First 还在本地数据库中记录:该“迁移”已经应用。文件名中的时间戳用于排序。

需要注意的是:在我们生成数据库的时候,除了New和NewType表外,还有一个系统生成表__MigrationHistory,从表名上就可以看出是迁移历史记录表。

  1. 在程序包管理器控制台输入Add-Migration Update-NewType-Name命令,Add-Migration表示增加一个迁移,后面是迁移名称,这个我们可以随便写,运行后会自动检测模型和数据库发生的变化,在Migrations文件夹下会生成一个“201702030624087_Update-NewType-Name.cs”文件,打开我们可以看到更新内容
namespace codeFirstDemo.Migrations
{
    using System;
    using System.Data.Entity.Migrations;
    
    public partial class UpdateNewTypeName : DbMigration
    {
        public override void Up()
        {
          AlterColumn("dbo.NewTypes", "Name", c => c.String(maxLength: 50));
        }
        
        public override void Down()
        {
          AlterColumn("dbo.NewTypes", "Name", c => c.String());
        }
    }
}

从上面可以看出就是我们上面修改模型的内容,当然你也可以在这上面直接修改,比如你再加一个更新,可以一起提交到数据库。

  1. 在程序包管理器控制台输入“Update-Database”命令,表示将所有的迁移应用到数据库,打开数据库,我们看一下效果:

从上面可以看出,字段Name的类型已经修改为nvarchar(50),而且字段值并没有发生变化,可以证明,Code First迁移并不是删除数据库再创建。