Entity Framework Core 之数据库迁移
最近打算用.NET Core写一份开源的简易CMS系统,来练练手
所以又去深入研究了一下Entity Framework Core
发现其实有些细节园子里还是很少讲到.
特意整理了几个细节.
1.数据库迁移
先了解一下什么是"数据库迁移",它提供了一种方法,可以逐步将Code First的实体架构更改应用于数据库,以保持数据库与EF Core模型同步,同时保留数据库中的现有数据。
EF Core的数据迁移相对EF6来说改了不少也简化了一些.所以我们现在就来看看如何进行数据迁移
我们以官方代码来做为例子..先来创建一个简单的上下文.
public class BloggingContext : DbContext
{
public BloggingContext()
: base() {
}
private static ILoggerFactory Mlogger => new LoggerFactory(); protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
Mlogger.AddProvider(new MyFilteredLoggerProvider());
var loggerFactory =
optionsBuilder
.UseMySql(@"链接地址"); }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
} public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
} public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; } public List<Post> Posts { get; set; }
} public class Post
{
public int PostId { get; set; }
[MaxLength()]
public string Title { get; set; }
public string Content { get; set; } public int? BlogId { get; set; }
public Blog Blog { get; set; }
}
}
然后我们通过Nuget来添加引用.
Microsoft.EntityFrameworkCore.Tools
打开NuGet包管理控制台
选择默认项目为实体上下文所在的程序集如下:

首先我们需要添加一个迁移版本.
执行命令如下:
Add-Migration BanBen1(这里是版本的名称,可以自己定义)
我们会发现Model程序集下多了一个文件夹为Migrations里面有3个文件.如下:

- XXXXXXXXXXXXX_BanBen1.cs - 主迁移文件。包含应用迁移(in
Up())和恢复(inDown())所需的操作。 - XXXXXXXXXXXXX_BanBen1.Designer.cs - 迁移元数据文件。包含EF使用的信息。
- BloggingContextModelSnapshot.cs - 当前模型的快照。主要用于确定添加下一次迁移时发生了哪些变化.
然后我们执行命令
Update-Database
如果你的数据库没创建,是第一次,就会执行成功,
如果你前期创建过数据库.但是是第一次创建迁移..就会失败.(注意这里!!)
因为第一次生成的迁移方法是按照新增来迁移的..而不是修改.
错误信息可能会如图:

解决方法是找到XXXXXXXXXXXXX_BanBen1.cs - 主迁移文件,删除Up和Down里面的代码.
删除后如下:
public partial class BanBen1 : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{ } protected override void Down(MigrationBuilder migrationBuilder)
{ }
}
其实这次迁移就没有修改数据库任何信息..
我们在来创建第二个迁移版本..
首先,我们修改实体类..给Post的Content加上长度限制,如下:
public class Post
{
public int PostId { get; set; }
[MaxLength()]
public string Title { get; set; }
[MaxLength()]
public string Content { get; set; } public int? BlogId { get; set; }
public Blog Blog { get; set; }
}
然后我们开始迁移..
记得每次迁移,都需要创建一个迁移版本!
我们执行命令如下(注意,我们的版本已经改为了2):
Add-Migration BanBen2
成功创建迁移文件之后,我们更新数据库.
Update-Database
成功信息如下:

然后我们进入数据库看看效果:

我们发现Content的长度限制已经改为了50
2.删除迁移
有的时候我们刚刚创建了一个迁移,还没应用到数据库,就发现自己需要变更实体.那我们就可以删除这个没有应用的迁移版本.
执行命令如下:(注意,这里是没有应用过的迁移,可以删除.如果应用过了.则会收到错误信息)
Remove-Migration
3.迁移回滚.
有些时候,我们需要回滚到之前的一个迁移版本.,比如我们部署的时候,开发版本和稳定版本肯定不一样..
那么我们就会用到回滚命令.
执行如下:
Update-Database 这里填写需要回滚的版本名
,比如我们执行如下:
Update-Database BanBen1
然后我们会发现,BanBen2中的长度限制,已经没有了..

4.生成一个迁移SQL脚本
有的时候,我们的生产数据库,是需要用脚本来创建库的.所以我们也可以直接通过实体来生成SQL脚本.命令如下:
Script-Migration
就会生成对应的迁移SQL脚本.如下:
CREATE TABLE `__EFMigrationsHistory` (
`MigrationId` varchar(95) NOT NULL,
`ProductVersion` varchar(32) NOT NULL,
CONSTRAINT `PK___EFMigrationsHistory` PRIMARY KEY (`MigrationId`)
); INSERT INTO `__EFMigrationsHistory` (`MigrationId`, `ProductVersion`)
VALUES ('20180316015722_BanBen1', '2.0.2-rtm-10011'); ALTER TABLE `Posts` MODIFY COLUMN `Content` varchar(50) NULL;
ALTER TABLE `Posts` ALTER COLUMN `Content` DROP DEFAULT;
INSERT INTO `__EFMigrationsHistory` (`MigrationId`, `ProductVersion`)
VALUES ('20180316022508_BanBen2', '2.0.2-rtm-10011');
当然,这个脚本可以自定义需要迁移的版本号.文件名,需要生成迁移脚本的上下文(多个上下文的情况).
5.迁移脚本的帮助说明.
我们可以通过命令来获取帮助说明
Get-Help about_EntityFrameworkCore
get-help Add-Migration -full
get-help Script-Migration -full
.
Entity Framework Core 之数据库迁移的更多相关文章
- ASP.NET CORE系列【六】Entity Framework Core 之数据库迁移
前言 最近打算用.NET Core写一份简单的后台系统,来练练手 然后又用到了Entity Framework Core 发现园子里有些文章讲得不是那么细节,对于新手小白来说,可能会有点懵. 特意整理 ...
- 添加Entity Framework Core,数据库迁移
1.建立Entity 建立IEntity的接口 建立实现IEntity接口的抽象类Entity 建立类继承抽象类Entity 2. 数据库放到infrastructure的项目中 3.注册和配置这个d ...
- 使用Entity Framework Core访问数据库(Oracle篇)
前言 哇..看看时间 真的很久很久没写博客了 将近一年了. 最近一直在忙各种家中事务和公司的新框架 终于抽出时间来更新一波了. 本篇主要讲一下关于Entity Framework Core访问ora ...
- ASP.NET CORE系列【六】Entity Framework Core 之数据迁移
原文:ASP.NET CORE系列[六]Entity Framework Core 之数据迁移 前言 最近打算用.NET Core写一份简单的后台系统,来练练手 然后又用到了Entity Framew ...
- 使用Entity Framework Core访问数据库(DB2篇)
前言 上一篇讲了一些EF Core访问Oracle的坑.(感兴趣请移步:使用Entity Framework Core访问数据库(Oracle篇)) 这篇主要讲一下关于EF Core访问DB2的一揽子 ...
- .NET Core Entity使用Entity Framework Core链接数据库
首先安装Nuget包 Install-package Microsoft.EntityFrameworkCore Install-package Microsoft.EntityFrameworkCo ...
- Asp.net Mvc Entity Framework Code First 数据库迁移
1.创建Mvc项目 2.安装Entity Framework 2.1.如下图打开程序包管理器控制台: 2.2.输入命令Install-Package EntityFramework,即可安装Entit ...
- asp.net core + entity framework core 多数据库类型支持实战
根据微软官方文档的说法,有两种方法可以实现在一个app中同时适应多种不同类型的数据库,并且全部支持migrations操作.其一,使用两个dbcontext:其二,修改migration文件,添加特定 ...
- 全自动迁移数据库的实现 (Fluent NHibernate, Entity Framework Core)
在开发涉及到数据库的程序时,常会遇到一开始设计的结构不能满足需求需要再添加新字段或新表的情况,这时就需要进行数据库迁移. 实现数据库迁移有很多种办法,从手动管理各个版本的ddl脚本,到实现自己的mig ...
随机推荐
- 广告等第三方应用嵌入到web页面方案 之 使用js片段
在自己的项目中嵌入过广告的朋友们可能都用过百度联盟, 只需要嵌入如下一段js代码片段, 就可以在自己的项目中嵌入广告, 来获得收益. <script type="text javasc ...
- 正本清源区块链——Caoz
正本清源区块链 说明:以下内容整理自Caoz的<正本清源区块链>,如有不妥,请联系我修改或删除. 简介 不讨论炒币!不讨论炒币!不讨论炒币! 本课程内容分为两部分: 第一部分,烧脑篇,介绍 ...
- datatables行编辑中,某个字段用户显示和用于行编辑名称不同时的处理。
比如tag这个字段,对应服务端bean的tag,但是在页面显示时需要为String类型的tagName,那么在行编辑时可以用以下的方式处理.
- 项目构建工具Maven
- [翻译] 编写高性能 .NET 代码--第二章 GC -- 减少分配率, 最重要的规则,缩短对象的生命周期,减少对象层次的深度,减少对象之间的引用,避免钉住对象(Pinning)
减少分配率 这个几乎不用解释,减少了内存的使用量,自然就减少GC回收时的压力,同时降低了内存碎片与CPU的使用量.你可以用一些方法来达到这一目的,但它可能会与其它设计相冲突. 你需要在设计对象时仔细检 ...
- JAVA多线程与并发学习总结
1. 计算机系统 使用高速缓存来作为内存与处理器之间的缓冲,将运算需要用到的数据复制到缓存中,让计算能快速进行:当运算结束后再从缓存同步回内存之中,这样处理器就无需等待缓慢的内存读写了. 缓 ...
- Swift 之属性setter、getter方法
Swift 之属性setter.getter方法 Swift中的属性分为两种属性,一种就是计算型属性 一种就是存储型属性,开始我虽然知道这两种属性,但是了解并不深对于他的setter和getter方法 ...
- 简述在javascript和jquery中cookie的使用
html <body onload="cookieJar()"></body> javascript <script href="../st ...
- 【前端】Vue和Vux开发WebApp日志三、完善gulp任务
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/vue_vux_3.html 项目github地址:https://github.com/shamoyuu/vue- ...
- DSP_TMS32F2812的串口操作
void scia_fifo_init(int ibaud) { SciaRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback // No parit ...