Entity Framework Core 2.0 数据库迁移
看见过几篇其他大神写的关于EFCore2.0的文章。本人有点小白,一开始看文档的时候除了一些基本操作外其他部分几乎没有读懂,我估计会有一部分人跟我一样,因为人家读懂了的早就懂了。
在这里我写一下我自己的理解和观点,并基于EF6的机制做一些比较。理解可能比较表象,如果有错误希望大神们指正。
一、迁移指令
从EF6的经验来讲,建立完基类,接口,表和一堆服务后我们,在模型初始化方法里添加迁移模式的配置然后,直接在控制台执行Enable-Migrations就可以了。
但是在EFCore2.0中我执行启动自动迁移,得到下面这个
Enable-Migrations is obsolete. Use Add-Migration to start using Migrations.
简单来说就是,Enable-Migrations过期了,让你用Add-Migration。
经过了一番百度得到的诸多的文章一般都是说,在控制台执行Add-Migration和Update-Database两个指令。参考 EF Core 数据库迁移(Migration)
先说下 Add-Migration 的基本用法, Add-Migration { 迁移名称 } -Context {上下文名称}
迁移名称:我理解为迁移的版本号或版本说明一类的东西
上下文名称:当项目中存在多个继承DBContext的类的时候需要指定上下文
还有其他的参数这里就先不说了。
执行 Add-Migration Update 等指令运行完,会发现项目下多了一个Migrations文件夹

一般来讲会有三个文件(名字都是我自己起的)
- 变更文件:时间戳_迁移名称.cs
- 结构快照:时间戳_迁移名称.Designer.cs
- 当前快照:上下文名称ModelSnapshot.cs
一般来讲变更文件和结构快照是配套出现的,而当前快照只有1个。随着执行迁移的次数的增加,文件数量也会越来越多。
变更文件,是EF根据当前的模型和已有的最新的快照生成变更方法文件

这里会涉及到两个方法,Up和Down。
Up是更新数据库的操作图上显示的就是一个创建表。
Down方法是回滚操作,也就是当你发现这次更新有问题的时候,回滚数据库版本(仅结构)用的。
结构快照,EF根据当前的模型生成的数据库结构文件,这个不用去管。
当前快照,会指向当前EF所运行的数据库迁移版本的快照,以这个为基准与数据库沟通,默认指向最新的结构快照。
二、CodeFirst迁移数据库
上面提到过了Enable-Migrations指令不好使了,那我们在添加迁移版本(Add-Migration)以后还要执行一下Update-Database。这个指令没啥好说的,直接执行就好。
执行完命令,我们会发现数据库建好了。
但是我认为这个方法非常的不方便,也不科学,为什么呢?
试想一下,我们的开发环境肯定与运行环境不是在一起的,更不可能用同一个数据库。那么我用IDE来跟新了开发用的数据库没问题,发布完跟部署工程师说:“你要在服务器上通过命令执行一个XXX命令才能建立或更新数据库”。这个不太可能!估计说完了,你部署的同事就疯了。
所幸在DBContext中发现了一个Database对象

它具有一个Migrate方法,可以来启动EF的数据库更新方法。
那我们可以修改数据库上下文的构造方法
public class ApplicationDb : DbContext
{ public ApplicationDb(DbContextOptions<ApplicationDb> options) : base(options)
{
if (!Database.EnsureCreated()) //确认数据库是否被建立
{
Database.Migrate();//启动迁移比对
}
} }
先检测数据库是否存在,如果不存在,则直接建立数据库,不进行迁移比对。存在的话,启动比对。根据官方文档,建立后不推荐执行Migrate方法以防冲突。
这样在项目启动的时候就会自动比对迁移,并更新数据库结构。
当然!这个代码仅用作示例!因为每次对创建DBContext兑现都去比对上下问,是对数据库一种无意义的重复开销,具体怎么封装,仁者见仁智者见智。
我的解决方案是做一个一异步的方法,在项目的Startup中的Configure中执行,达到项目启动时执行的效果。
三、EFCore2.0 与EF6迁移机制上的区别
EF都会在数据库里生成一个以前版本的表
EF6叫__MigrationHistory

EFCore2.0叫__EFMigrationsHistory

这两个文件都会存储迁移版本的名称,只不过EF6是自动生成的,EFCore2.0是要手动生成的。然后最关键的是Model字段。这个就是我们所谓的数据库快照。
EF6中每次启动的时候会根据当前模型生成一个模型快照,然后与数据库中最新的快照进行比对,如果产生差异,根据差异变更数据库。
但是在Core中并没有保存数据库快照,而是以代码的形式来保存。这就是为什么我们随着执行迁移的次数的增加,文件数量也会越来越多。那些文件都是数据库的快照。而数据库的本身只存储指向版本。
所以跟EF6一样,我们为了减少快照所占控件,可以删除除最新以外的快照文件(只要你不想回滚)。
四、关于迁移需要注意
本来我是打算做一个批处理文件,注册在在项目编译前,在项目编译的时候自动生成迁移。但是目前EFCore2.0的迁移功能还不够智能。
因为在你对字段重命名以后默认是删除字段,然后重建字段,而不是重命名字段。这点在EF6中做的还算不错。
所以需要开发者在添加迁移以后,去检查一下Up方法的操作是否是我们想要的。当然如果你需要用到回滚那还要检查一下Down方法。
这个希望能在以后的版本中得到改善吧。
Entity Framework Core 2.0 数据库迁移的更多相关文章
- ASP.Net Core项目在Mac上使用Entity Framework Core 2.0进行迁移可能会遇到的一个问题.
在ASP.Net Core 2.0的项目里, 我使用Entity Framework Core 2.0 作为ORM. 有人习惯把数据库的连接字符串写在appSettings.json里面, 有的习惯写 ...
- Entity Framework Core 2.0 使用代码进行自动迁移
一.前言 我们在使用EF进行开发的时候,肯定会遇到将迁移更新到生产数据库这个问题,前面写了一篇文章介绍了Entity Framework Core 2.0的入门使用,这里面介绍了使用命令生成迁移所需的 ...
- Working with Data » Getting started with ASP.NET Core and Entity Framework Core using Visual Studio »迁移
Migrations¶ 4 of 4 people found this helpful The Contoso University sample web application demonstra ...
- .Net Core 2.0生态(4):Entity Framework Core 2.0 特性介绍和使用指南
前言 这是.Net Core 2.0生态生态介绍的最后一篇,EF一直是我喜欢的一个ORM框架,随着版本升级EF也发展到EF6.x,Entity Framework Core是一个支持跨平台的全新版本, ...
- UWP: 在 UWP 中使用 Entity Framework Core 操作 SQLite 数据库
在应用中使用 SQLite 数据库来存储数据是相当常见的.在 UWP 平台中要使用 SQLite,一般会使用 SQLite for Universal Windows Platform 和 SQLit ...
- 【EF】Entity Framework Core 2.0 特性介绍和使用指南
阅读目录 前言 获取和使用 新特性 项目升级和核心API变化 下一步计划 遗憾的地方 回到目录 前言 这是.Net Core 2.0生态生态介绍的最后一篇,EF一直是我喜欢的一个ORM框架,随着版本升 ...
- Entity Framework Core 2.0 全局查询过滤器
不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: http://gunnarpeipman.com/2017/08/ef ...
- Entity Framework Core 2.0 中使用LIKE 操作符
Entity Framework Core 2.0 中使用LIKE 操作符 不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译 ...
- ASP.NET Core 1.0、ASP.NET MVC Core 1.0和Entity Framework Core 1.0
ASP.NET 5.0 将改名为 ASP.NET Core 1.0 ASP.NET MVC 6 将改名为 ASP.NET MVC Core 1.0 Entity Framework 7.0 将 ...
随机推荐
- 爬虫协议robots
前面的话 Robots协议(也称为爬虫协议.机器人协议等)全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页 ...
- LoadRunner性能测试-LoadRunner工具安装
Loadrunner11安装 1,在网上下载loadrunner11安装包 (百度可以下载安装包) 2,打开安装文件,点击setup.exe进行安装: 3,win10系统可能会出现如下问题: 提示管理 ...
- 办公楼[POI2007]
题目描述 FGD开办了一家电话公司.他雇用了N个职员,给了每个职员一部手机.每个职员的手机里都存储有一些同事的电话号码.由于FGD的公司规模不断扩大,旧的办公楼已经显得十分狭窄,FGD决定将公司迁至一 ...
- 新的表格展示利器 Bootstrap Table
1.bootstrap table简介及特征 Bootstrap Table是国人开发的一款基于 Bootstrap 的 jQuery 表格插件,通过简单的设置,就可以拥有强大的单选.多选.排序.分 ...
- 数据库db2错误代码大全
sqlcode sqlstate 说明000 00000 SQL语句成功完成01xxx SQL语句成功完成,但是有警告+012 01545 未限定的列名被解释为一个有相互关系的引用+098 01568 ...
- jquery左右切换的无缝滚动轮播图
1.HTML结构: <head> <script type="text/javascript" src="../jquery-1.8.3/jquery. ...
- IE浏览器-在Win7系统的安装和卸载
关于安装 在虚拟机(VMware Workstation)的Win7操作系统里,安装从官网下载的IE9/10/11 For Win7,始终失败.于是通过其它途径搜索到IE9/10/11 For Win ...
- owncloud存储云服务搭建
owncloud是一款开源的存储云,用php写的,其作用可以像百度网盘那样存放文件到这个云当中, 只要能连上网,手机,平板,电脑都可以从中下载或者上传文件,用起来非常还不错,部署的过程也很简单,废话不 ...
- U3D 控件
1.普通控件 GUI.Label() GUI.Button()等方法添加控件 bool clicked = GUI.Button() 当按钮单击时,返回true string ss = GUI.Tex ...
- IPV6与IPV4的区别
IPv4协议的地址长度是32位,IPv6协议的地址长度是128位. 1.表示方式 IPv4地址表示为点分十进制格式,32位的地址分成4个8位分组,每个8位以十进制数显式,中间用点号分隔. 而IPv6采 ...