EF Core 迁移

感觉就是以前EF Code First的自动同步数据库功能

内容:在你新增、更新TableModel后,如何自动化的更新DB中的真实Table。以及对这些更改进行一个版本控制。

本文将以一个示例进行简单明了的演示输出。(不会很详细,只记录主要步骤)

当下我们已经有了一个ASP.NET Core的web应用程序,本文我们所关心的只有2个:
1、Model
2、DB Table

当下:

Model

最后一个为导航属性,无视。

Table

现在我们要在Model/Student.cs 加一个属性

   public string NewColForTest { get; set; }

更改后

对应的Table,我们希望变成如下

如何操作呢?

办法有很多,本文介绍由EF Core提供的一种迁移。

优点

  • 不需要去手动操作数据库
  • 不会影响现有db data(也就是不是重建db)
  • 可追溯更改内容,即版本控制

开始动手

前期准备

建一个ASP.NET Core web Application,用EF Core连接好数据库,建好Student.cs

编辑*.csproj 文件,添加highlight内容

cmd 定位到项目根目录(即Startup.cs所在目录)

dotnet ef migrations add InitialCreate

将初始化EF Core用于迁移的文件。InitialCreate是其中一个迁移记录的版本文件名,暂不关心。

现在你的项目中将多出:

【SchoolContext】ModelSnapshot里面记录了要生成db的内容。

20180513071210_【InitialCreate】记录了此次更新(同上个版本)的部分,由于我们是第一次初始化,所以里面记录了全部表结构内容。

【SchoolContext】ModelSnapshot:

partial class SchoolContextModelSnapshot : ModelSnapshot{protected override void BuildModel(ModelBuilder modelBuilder){ modelBuilder.HasAnnotation("ProductVersion", "2.0.2-rtm-10011").HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);...modelBuilder.Entity("ContosoUniversity.Models.Student", b =>{b.Property<int>("ID").ValueGeneratedOnAdd();b.Property<DateTime>("EnrollmentDate");b.Property<string>("FirstMidName");b.Property<string>("LastName");b.Property<string>("NewColForTest");b.HasKey("ID");b.ToTable("Student");});...}}

20180513071210_【InitialCreate】:

public partial class InitialCreate : Migration{protected override void Up(MigrationBuilder migrationBuilder){...migrationBuilder.CreateTable(name: "Student",columns: table => new{ID = table.Column<int>(nullable: false).Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),EnrollmentDate = table.Column<DateTime>(nullable: false),FirstMidName = table.Column<string>(nullable: true),LastName = table.Column<string>(nullable: true)},constraints: table =>{table.PrimaryKey("PK_Student", x => x.ID);});... }protected override void Down(MigrationBuilder migrationBuilder){...migrationBuilder.DropTable(name: "Student");}}

回到cmd 定位到项目根目录

dotnet ef database update

EF Core将为我们跟db同步

现在我们的db应该跟Model是一致的(多余的细节,这里就不赘述了)

做到这里,我们应该清楚EF Core是通过生成/Migrations Folder的内容来实现同步db。

此时还会新生成一个表用于版本记录

EF Core 使用 __MigrationsHistory 表查看是否需要运行任何迁移。 如果 DB 已是最新,则无需运行迁移。

Now

更改Student.cs

添加新属性NewColForTest

按照我们的猜测,要同步更新db,应该就是更改/Migrations Folder里的内容。把该属性对应的添加上去,然后执行

dotnet ef database update

即可实现同步更新(迁移)。

现在这里可以手动更改/Migrations Folder里的两个文件,然后执行cmd。

那么可以不手动吗?

可以,先执行命令,生成一个新的差异版本Migration,我们命名为UpdateStudent

dotnet ef migrations add UpdateStudent

结果

点开文件

只有差异内容。

 public partial class UpdateStudent : Migration{protected override void Up(MigrationBuilder migrationBuilder){migrationBuilder.AddColumn<string>(name: "NewColForTest",table: "Student",nullable: true);}protected override void Down(MigrationBuilder migrationBuilder){migrationBuilder.DropColumn(name: "NewColForTest",table: "Student");}}

最后执行

dotnet ef database update

查看我们的db

原有的数据也仍在。完成。

注意:如果命令报错,可以检查是否把iis express退出。

总结

我觉得很大一个亮点是每次更新都生成一个追踪版本,某些情况下,省去了单独维护sql 脚本的工作。

与EF Code First比较,运行的更加“透明”,让我们更直接的知道发生了什么,黑魔法的感觉少了很多。Code First更新在配置完成下只需要运行F5,即DB 同步成功,让人感觉不是那么“亲近”。

认识较浅,请指教。

Thanks All.

欢迎讨论~
感谢阅读~

个人公众号:

原文:https://segmentfault.com/a/11...

EF Core Model更新迁移相关推荐

  1. .NET 5中的EF Core 5数据迁移:在单独的库中并自动部署

    目录 1.简介 2.先决条件 3.使用Dotnet CLI创建解决方案和项目框架 4.在DataAcess中创建模型和数据上下文 5.在WebApp中启动数据库 6.添加数据迁移功能 7.更改数据库模 ...

  2. ef core mysql 生成迁移失败_EF Core 数据库迁移(Migration)

    标签: 工具与环境介绍 1.开发环境为vs 2015 场景 设计两张表 用户表(user)和发帖表(user) 一个用户对应多个用户 Coding Begin 1.新建项目(新建一个空console项 ...

  3. EF Core codefirst数据迁移操作

    摘要 在开发中,使用EF code first方式开发,那么如果涉及到数据表的变更,该如何做呢?当然如果是新项目,删除数据库,然后重新生成就行了,那么如果是线上的项目,数据库中已经有数据了,那么删除数 ...

  4. .Net Core建站(2):EF Core+CodeFirst数据库迁移

    上一篇的话,说了下怎么使用EF7 实现 CodeFirst去生成数据库, 其实还有好多问题的,这次一点一点的解决吧,都挺简单,不过零零散散的,, 1.读取配置文件,获得链接字符串 2.使用数据库进行增 ...

  5. ef core mysql 生成迁移失败_EFCore + MySql codeFirst 迁移 Migration出现的问题

    第二次使用Migration update-database的时候出现以下错误: System.NotImplementedException: The method or operation is ...

  6. Entity Framework Core 之数据库迁移

    前言 最近打算用.NET Core写一份开源的简易CMS系统,来练练手 所以又去深入研究了一下Entity Framework Core 发现其实有些细节园子里还是很少讲到. 特意整理了几个细节. 正 ...

  7. mysql多租户schema复制,Asp.net core下利用EF core实现从数据实现多租户(3): 按Schema分离 附加:EF Migration 操作...

    前言 前段时间写了EF core实现多租户的文章,实现了根据数据库,数据表进行多租户数据隔离. 今天开始写按照Schema分离的文章. 其实还有一种,是通过在数据表内添加一个字段做多租户的,但是这种模 ...

  8. 一步步学习EF Core(3.EF Core2.0路线图)

    前言 这几天一直在研究EF Core的官方文档,暂时没有发现什么比较新的和EF6.x差距比较大的东西.不过我倒是发现了EF Core的路线图更新了,下面我们就来看看 今天我们来看看最新的EF Core ...

  9. 查缺补漏系统学习 EF Core 6 - 批量操作

    推荐关注「码侠江湖」加星标,时刻不忘江湖事 这是 EF Core 系列的第七篇文章,上一篇文章讲述了 EF Core 中的实体数据修改. 这篇文章讲一讲 EF Core 如何进行批量操作. 在众多的 ...

最新文章

  1. php中如何想时间转为时间戳,php中怎么将时间转换为时间戳
  2. 基于深度学习识别模型的缺陷检测
  3. 可穿戴智能设备的发展趋势及技术变化
  4. 基于stm32、0.96寸OLED实现的贪吃蛇小游戏(详细源码注释)
  5. Linux / pthread_create() 函数所使用的线程函数为什么必须是静态函数?
  6. java数据分析库,威力加强版
  7. QT5 exec()模态显示子对话框,父子对话框都最小化后显示桌面
  8. 30 岁程序员:关于编程,我终于想清楚这 30 件事了!
  9. Python字符串类型:字符串索引、字符串切片、字符串format()方法格式化、字符串操作符、字符串处理函数
  10. mysql qpstps测试_mysql操作日志
  11. 网站去色的通用方法(简单)
  12. 在机器学习领域,怎样写好一篇论文
  13. C++ 1179:奖学金
  14. 【深度学习】梯度消失与梯度爆炸的原因分析与解决策略
  15. Mysql - 聚簇索引和辅助索引
  16. 领航机器人广告段子_医院机器人物流科技宣传广告语_段子网收录最新段子
  17. Jvav-C++/真正的Jvav
  18. Gantt(甘特图)与PERT(项目计划评审技术)图,项目关键路径和松弛时间
  19. html5绘制火柴棒人物
  20. 【测试方法】黑盒测试、灰盒测试、白盒测试这些你确定都会了吗?

热门文章

  1. composer php 使用方法,Composer的基本使用方法
  2. linux双4g内存花屏,linux不支持4G内存的处理方法
  3. java creat uid_关于uniqueidentifier:如何在Java中创建唯一ID?
  4. 如何判断数组所有数都不等于一个数_【每日算法Day 91】求解数组中出现次数超过1/3的那个数
  5. python监控进程并实现掉线重启
  6. 【CV秋季划】图像质量提升与编辑有哪些研究和应用,如何循序渐进地学习好?...
  7. conn.execute参数
  8. json里面返回模板输出的html,在JSON响应中返回完整页面的HTML而不是字符串输出...
  9. CSS 知识(13---)
  10. MongoDB数据库安装与连接