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.

欢迎讨论~

感谢阅读~

个人公众号:

原文:http://www.cnblogs.com/joeymary/p/9032825.html

EF Core Model更新迁移的更多相关文章

  1. 谈谈EF Core实现数据库迁移

    作为程序员,在日常开发中,记忆犹新的莫过于写代码,升级程序.升级程序包含两部分:一是,对服务程序更新:二是,对数据库结构更新.本篇博文主要介绍数据库结构更新,在对数据库升级时,不知道园友们是否有如下经 ...

  2. EntityFramework Core 2.x (ef core) 在迁移中自动生成数据库表和列说明

    在项目开发中有没有用过拼音首字母做列名或者接手这样的项目? 看见xmspsqb(项目审批申请表)这种表名时是否有一种无法抑制的想肛了取名的老兄的冲动? 更坑爹的是这种数据库没有文档(或者文档老旧不堪早 ...

  3. 记录在EF Core级联更新时出现的错误The database operation was expected to affect 1 row(s), but actually affected 0 row(s) (低级错误导致)

    错误提示:The database operation was expected to affect 1 row(s), but actually affected 0 row(s); data ma ...

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

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

  5. EntityFramework Core 运行dotnet ef命令迁移背后本质是什么?(EF Core迁移原理)

    前言 终于踏出第一步探索EF Core原理和本质,过程虽然比较漫长且枯燥乏味还得反复论证,其中滋味自知,EF Core的强大想必不用我再过多废话,有时候我们是否思考过背后到底做了些什么,到底怎么实现的 ...

  6. Cookies 初识 Dotnetspider EF 6.x、EF Core实现dynamic动态查询和EF Core注入多个上下文实例池你知道有什么问题? EntityFramework Core 运行dotnet ef命令迁移背后本质是什么?(EF Core迁移原理)

    Cookies   1.创建HttpCookies Cookie=new HttpCookies("CookieName");2.添加内容Cookie.Values.Add(&qu ...

  7. EF core (code first) 通过自动迁移实现多租户数据分离 :按Schema分离数据

    前言 本文是多租户系列文章的附加操作文章,如果想查看系列中的其他文章请查看下列文章 主线文章 Asp.net core下利用EF core实现从数据实现多租户(1) Asp.net core下利用EF ...

  8. EF Core学习Code First

    下面通过实例来学习EF Core Code First,也就是通过EF Core迁移来完成从模型生成数据库. 本实例使用EntityFrameworkCore SQLite 数据库进行介绍,大家也可以 ...

  9. Entity Framework Core 之数据库迁移

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

随机推荐

  1. Python学习笔记 - 字符串和编码

    #!/usr/bin/env python3 # -*- coding: utf-8 -*- #第一行注释是为了告诉Linux/OS X系统, #这是一个Python可执行程序,Windows系统会忽 ...

  2. (十二)UITableView的基本使用

    UITableView之所以支持滚动,是因为继承自UIScrollView.默认是垂直滚动,性能极佳. UITableView的两种样式: 1.UITableViewStylePlain       ...

  3. 【57】android图片印刻,阳刻,素描图效果处理

    介绍我参与开发的妙趣剪纸app使用的图片处理相关的技术 关于妙趣剪纸,各大android商店都可以下载,下面贴出小米商店的链接 妙趣剪纸下载 软件效果截图 如何实现上面的图片处理效果呢 1.初始化高斯 ...

  4. 链路层 - SLIP,PPP,

    最常使用的封装格式是RFC 894定义的格式.图2 - 1显示了两种不同形式的封装格式.图中每个方框下面的数字是它们的字节长度. 两种帧格式都采用48 bit(6字节)的目的地址和源地址( 8 0 2 ...

  5. thrift实现HDFS文件操作

    thrift 文件如下 namespace java com.pera.file.transform struct  File{     1:string path ,     2:string co ...

  6. 安卓学习笔记--已root设备应用请求root权限

    网上查到的方法 Process process = null; DataOutputStream os = null; try { String cmd = "chmod 777 " ...

  7. C++语言之析构函数与构造函数

    #include <iostream> using namespace std ; class Dog { //默认情况下定义变量为私有 int a ; public: //两个函数都只能 ...

  8. 关于UIView用户交互相关的属性和方法

    UIView除了负责展示内容给用户外还负责响应用户事件 1.交互相关的属性 userInteractionEnabled 默认是YES ,如果设置为NO则不响应用户事件,并且把当前控件从事件队列中删除 ...

  9. JVM学习--(八)java堆分析

    上一节介绍了针对JVM的监控工具,包括JPS可以查看当前所有的java进程,jstack查看线程栈可以帮助你分析是否有死锁等情况,jmap可以导出java堆文件在MAT工具上进行分析等等.这些工具都非 ...

  10. myeclipse10破解

    原本一直使用eclipse,但是写起web还是不太方便,由于idea使用不太顺手不太爱用.原来一直不能破解,今天迫不得已又拿起myeclipse仔细搞一番.下面是遇到的问题的总结. 不成功原因一:.原 ...