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 发现其实有些细节园子里还是很少讲到. 特意整理了几个细节. 正 ...
随机推荐
- OC第二天—封装
/.锁定头文件的方法 1. 打开终端 2. 进入到Xcode的目录, 命令: cd /Applications/Xcode.app 3. 把系统头文件修改为只读, 命令: sudo chown ...
- wing带你玩转自定义view系列(3)模仿微信下拉眼睛
发现了爱神的自定义view系列,我只想说一个字:凸(艹皿艹 ) !!相见恨晚啊,早看到就不会走这么多弯路了 另外相比之下我这完全是小儿科..所以不说了,这篇是本系列完结篇....我要从零开始跟随爱哥脚 ...
- 【linux学习笔记】在ubuntu下使用QT Cmake支持C++11
今天在ubuntu下使用QT来进行C++编程,选择了Cmake,当用到initializer_list的时候提示不支持C++11,现提供一下解决方案: 错误提示: error: This file r ...
- java 多线程和线程池
● 多线程 多线程的概念很好理解就是多条线程同时存在,但要用好多线程确不容易,涉及到多线程间通信,多线程共用一个资源等诸多问题. 使用多线程的优缺点: 优点: 1)适当的提高程序的执行效率(多个线程同 ...
- 11个超棒的iOS开发学习网站
原文:11 Insanely Great iOS Developers Sites 永不止步地向他人学习 我相信,要想从一个"还不错"的人变成一个卓越的人,我们需要不停地向他人学习 ...
- MASM中3中文本宏的使用与区别
= 宏 格式 : name = exp 其中,exp只能为32位整数值,且用=宏定义的符号名称可以重定义: EQU 宏 格式1:name EQU exp exp为有效整数值,可以重定义: 格式2:na ...
- HDFS的java api操作
hdfs在生产应用中主要是针对客户端的开发,从hdfs提供的api中构造一个HDFS的访问客户端对象,然后通过该客户端对象操作(增删改查)HDFS上的文件. 搭建开发环境 方式一(windows环境下 ...
- 深入源码解析类Route
微软官网对这个类的说明是:提供用于定义路由及获取路由相关信息的属性和方法.这个说明已经很简要的说明了这个类的作用,下面我们就从源码的角度来看看这个类的内部是如何工作的. public class Ro ...
- jQuery插件学习基础
1.给jQuery添加全局的函数: $.zgz={ fn1:function(){ alert('我是刚设置的第一个全局函数') },fn2:function(){ alert('我是刚设置的第二个 ...
- 大型B2C网站高性能可伸缩架构技术探秘
大型B2C网站高性能可伸缩架构技术探秘 2010-07-21 08:51 狂放不羁 JavaEye 字号:T | T 向您介绍大型B2C网站高性能的网站架构技术,包括缓存的使用.应用程序和数据库的拆分 ...