EF Core Model更新迁移
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更新迁移的更多相关文章
- 谈谈EF Core实现数据库迁移
作为程序员,在日常开发中,记忆犹新的莫过于写代码,升级程序.升级程序包含两部分:一是,对服务程序更新:二是,对数据库结构更新.本篇博文主要介绍数据库结构更新,在对数据库升级时,不知道园友们是否有如下经 ...
- EntityFramework Core 2.x (ef core) 在迁移中自动生成数据库表和列说明
在项目开发中有没有用过拼音首字母做列名或者接手这样的项目? 看见xmspsqb(项目审批申请表)这种表名时是否有一种无法抑制的想肛了取名的老兄的冲动? 更坑爹的是这种数据库没有文档(或者文档老旧不堪早 ...
- 记录在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 ...
- .Net Core建站(2):EF Core+CodeFirst数据库迁移
上一篇的话,说了下怎么使用EF7 实现 CodeFirst去生成数据库, 其实还有好多问题的,这次一点一点的解决吧,都挺简单,不过零零散散的,, 1.读取配置文件,获得链接字符串 2.使用数据库进行增 ...
- EntityFramework Core 运行dotnet ef命令迁移背后本质是什么?(EF Core迁移原理)
前言 终于踏出第一步探索EF Core原理和本质,过程虽然比较漫长且枯燥乏味还得反复论证,其中滋味自知,EF Core的强大想必不用我再过多废话,有时候我们是否思考过背后到底做了些什么,到底怎么实现的 ...
- 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 ...
- EF core (code first) 通过自动迁移实现多租户数据分离 :按Schema分离数据
前言 本文是多租户系列文章的附加操作文章,如果想查看系列中的其他文章请查看下列文章 主线文章 Asp.net core下利用EF core实现从数据实现多租户(1) Asp.net core下利用EF ...
- EF Core学习Code First
下面通过实例来学习EF Core Code First,也就是通过EF Core迁移来完成从模型生成数据库. 本实例使用EntityFrameworkCore SQLite 数据库进行介绍,大家也可以 ...
- Entity Framework Core 之数据库迁移
前言 最近打算用.NET Core写一份开源的简易CMS系统,来练练手 所以又去深入研究了一下Entity Framework Core 发现其实有些细节园子里还是很少讲到. 特意整理了几个细节. 正 ...
随机推荐
- GIT版本控制 — GIT与SVN的相互转换 (三)
git-svn git-svn用于Git和SVN的转换,可以把Git仓库迁移成SVN仓库,反之亦可. 详细介绍可见[1],或者命令行输入git-svn. Bidirectional operation ...
- 在Windows下搭建Gitlab服务器
一.GitLab简介 GitLab 是一个用于仓库管理系统的开源项目.使用Git作为代码管理工具,并在此基础上搭建起来的web服务. 可通过Web界面进行访问公开的或者私人项目.它拥有与Github类 ...
- Leetcode_53_Maximum Subarray
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/43989997 Find the contiguous su ...
- Android listView异步下载和convertView复用产生的错位问题
1:Item图片显示重复 这个显示重复是指当前行Item显示了之前某行Item的图片. 比如ListView滑动到第2行会异步加载某个图片,但是加载很慢,加载过程中ListView已经滑动到了第14行 ...
- 【Java编程】Java基本数据类型
在较前面的一篇博文<C/C++基本数据类型>中,我主要介绍了c/c++的基本数据类型.我们知道C语言没有具体规定各类数据类型所占内存的字节数,只要求long型数据长度不小于int型,sho ...
- 安卓Eclipse开发者的福音
我们知道,谷歌已经放弃对Eclipse(ADT)的维护更新了,现在官网上也找不到ADT的下载链接了,我们大多数同学仍在使用的ADT版本可能已经很老了,估计大多数的SDK版本只到4.4,而,在尝试升级以 ...
- 安卓笔记--Edittext禁止换行
直接在EditText的xml文件中通过配置android:singleLine="true"把虚拟键盘上的enter键禁止掉,不会显示 <edittext android: ...
- 苹果新的编程语言 Swift 语言进阶(七)--枚举、结构、类
Swift语言中,具有类特征的类型包括三种,即枚举类型.结构类型(包括基本类型,基本类型实际都是结构类型的特例).类.其中枚举类型.结构类型是属于值类型,类属于引用类型.三种类型都可以添加属性.方法. ...
- mybatis源码之StatementHandler
/** * @author Clinton Begin */ public interface StatementHandler { Statement prepare(Connection conn ...
- How--to-deploy-smart-contracts-on
The following smart contract code is only an example and is NOT to be used in Production systems. pr ...