• EF Code First Migration总结


    开启Migration

    1. 通过 Tools->Nuget Package Manager->Package Manager Console 打开Package Manager Console窗口

    2. Default Project选择当前的DbContext所在的项目

    3. 通过命令开启Migration

    Enable-Migrations

    开启之后,DbContext对应的项目中会生成一个Migrations的文件夹, 主要用来存放各个版本自动生成的更新描述文件

    类似于下图:

    image

    初始化库

    通常你新建了模型,在数据库建库之后需要执行一次add-migration命令生成一个库初始化的migration记录

    add-migration 20160201003

    后面部分的名字我通常都会按照当天日期拼接当天的版本号组成,另外一种不错的实践是按照增加的业务名称命名,英文名称会相对好点.

    更新库

    库的更新可以分为手动更新跟自动更新, 通常Code First Migration的文章都会讲这里要通过Update-Database命令来把刚才的变更更新到库里面, 通常DEV环境可以这么做,因为是直连的, 但是我们的Staging与Production环境是不可以直连的,我们要怎么做呢?

    前面有提到可以自动更新,其意思就是说,你通过 add-migration生成了migration脚本,那当程序启动的时候,如果发现数库接口不一致,那这个就需要更新,这个时候如果是自动更新的状态,那程序会自动执行(从意思上等同于update-database, 产生的效果相同,但是并未实际考证是否也是跑的update-database命令), 因此无论是dev环境还是staging, production都可以通过自动update-database来完成数据库的更新。

    如何设置自动更新

    这里有两步:

    1. 在migrations文件夹下有个configuration的文件, 代码如下:

    public Configuration()
            {
                AutomaticMigrationsEnabled = true;
                AutomaticMigrationDataLossAllowed = false;
            }

    AutomaticMigrationsEnable = true 之后, 设置EF为自动做数据库更新。

    2. 在Global.cs或者任何程序启动的地方加入:

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

    这句是设定当前DbContext的一个初始化配置.

    潜在的问题

    自动迁移,在某些该名称,或者删除字段的时候,会造成现有数据的丢失,这个需要注意,目前我也是在探索过程中,有进一步的研究成果,会在更新博文说明。

     

    【补充部分】

    初始化脚本的更新

    public partial class InitDefaultData : DbMigration
        {
            public override void Up()
            {
                Sql(@"
    --初始化FileType原始数据
    insert into FileType (SysId,FileTypeId,FileTypeName,Status,CreationTime) select NEWID(),10001,'客户资料',0,GETDATE();
    insert into FileType (SysId,FileTypeId,FileTypeName,Status,CreationTime) select NEWID(),10002,'订单资料',0,GETDATE();
    insert into FileType (SysId,FileTypeId,FileTypeName,Status,CreationTime) select NEWID(),10003,'车辆资料',0,GETDATE();
    
    --初始化FileCategory原始数据
    insert into FileCategory (SysId,FileCategoryId,FileCategoryName,Status,CreationTime) select NEWID(),1,'图片',0,GETDATE();
    insert into FileCategory (SysId,FileCategoryId,FileCategoryName,Status,CreationTime) select NEWID(),2,'复印件',0,GETDATE();
    insert into FileCategory (SysId,FileCategoryId,FileCategoryName,Status,CreationTime) select NEWID(),3,'视频',0,GETDATE();
    insert into FileCategory (SysId,FileCategoryId,FileCategoryName,Status,CreationTime) select NEWID(),4,'Excel文件',0,GETDATE();
    insert into FileCategory (SysId,FileCategoryId,FileCategoryName,Status,CreationTime) select NEWID(),5,'Word文件',0,GETDATE();
    ");
            }
    
            public override void Down()
            {
                Sql(@"truncate table FileType");
                Sql(@"truncate table FileCategory");
            }
        }

    可以通过Sql函数来执行一些自定义的SQL脚本。

  • 相关阅读:
    Meteor + node-imap(nodejs) + mailparser(nodejs) 实现完整收发邮件
    详解log4j2(上)
    循序渐进之Spring AOP(6)
    循序渐进之Spring AOP(5)
    循序渐进之Spring AOP(3)
    循序渐进之Spring AOP(4)
    循序渐进之Spring AOP(2)
    循序渐进之Spring AOP(1)
    通俗的解释JAVA wait/notify机制
    开发高性能JAVA应用程序基础(内存篇)
  • 原文地址:https://www.cnblogs.com/feinian/p/5176041.html
Copyright © 2020-2023  润新知