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(50)]
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(50)]
public string Title { get; set; }
[MaxLength(50)]
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
原文:https://www.cnblogs.com/GuZhenYin/p/8579420.html
.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com
Entity Framework Core 之数据库迁移相关推荐
- oracle精简版_使用Entity Framework Core访问数据库(Oracle篇)
前言 哇..看看时间 真的很久很久没写博客了 将近一年了. 最近一直在忙各种家中事务和公司的新框架 终于抽出时间来更新一波了. 本篇主要讲一下关于Entity Framework Core访问ora ...
- 使用Entity Framework Core访问数据库(Oracle篇)
前言 哇..看看时间 真的很久很久没写博客了 将近一年了. 最近一直在忙各种家中事务和公司的新框架 终于抽出时间来更新一波了. 本篇主要讲一下关于Entity Framework Core访问ora ...
- 使用Entity Framework Core访问数据库(DB2篇)
上一篇讲了一些EF Core访问Oracle的坑.(感兴趣请移步:使用Entity Framework Core访问数据库(Oracle篇)) 这篇主要讲一下关于EF Core访问DB2的一揽子~问题 ...
- 【华为云技术分享】Entity Framework Core 捕获数据库变动
在实际项目中我们往往需要记录存储在数据库中数据的变动(例如修改数据前记录下数据的原始值),这样一来在发生误操作时可以将数据恢复到变动前的状态,也可以追溯到数据的修改人.大部分开发人员会自己定义记录数据 ...
- 全自动迁移数据库的实现 (Fluent NHibernate, Entity Framework Core)
在开发涉及到数据库的程序时,常会遇到一开始设计的结构不能满足需求需要再添加新字段或新表的情况,这时就需要进行数据库迁移. 实现数据库迁移有很多种办法,从手动管理各个版本的ddl脚本,到实现自己的mig ...
- Entity Framework Core生成的存储过程在MySQL中需要进行处理及PMC中的常用命令
在使用Entity Framework Core生成MySQL数据库脚本,对于生成的存储过程,在执行的过程中出现错误,需要在存储过程前面添加 delimiter // 附:可以使用Visual Stu ...
- Entity Framework Core 2.0 使用代码进行自动迁移
一.前言 我们在使用EF进行开发的时候,肯定会遇到将迁移更新到生产数据库这个问题,前面写了一篇文章介绍了Entity Framework Core 2.0的入门使用,这里面介绍了使用命令生成迁移所需的 ...
- 创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表
创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表 创建数据模型类(POCO类) 在Models文件夹下添 ...
- Entity Framework Core系列教程-3为现有数据库生成实体模型
在Entity Framework Core中为现有数据库创建模型 在这里,您将学习如何在Entity Framework Core中为现有数据库创建上下文和实体类.为现有数据库创建实体和上下文类称为 ...
最新文章
- InnoDB: Failing assertion: trx-isolation_level == TRX_ISO_READ_UNCOMMITTED
- 基于easyui开发Web版Activiti流程定制器详解(五)——Draw2d详解(一)
- 新版V3.5.0来袭,更省心,更好用!
- 美团在Redis上踩过的一些坑-5.redis cluster遇到的一些问题
- 大道至简,阿里巴巴敏捷教练的电子看板诞生记
- jq 修改swal的标题_js-jquery-SweetAlert2【一】使用
- java中跳转页面的干法_java – 有没有一种干法来整合RowMappers的相同代码?
- OpenShift 4 - 用Compliance Operator对OpenShift进行安全合规扫描
- 腾讯2014实习北京笔试
- 抢食生鲜,美团最大对手会是拼多多
- IDC发布最新中国AI云服务市场报告,百度智能云连续三次排名第一
- python+django高速公路收费管理系统的设计
- mybatis 3.x 缓存Cache的使用
- word删除分页符的两种方法
- 修改contour的线条颜色
- 2022全新玖五社区系统源码V9.8版
- SpringCloud核心组件概述(五大神兽)
- JavaWeb-----Ajax异步请求 json对象 服务器如何返回json数据 使用ajax完成一个案例
- 2021陇剑杯部分wp
- 【Arduino基础】蜂鸣器发声实验
热门文章
- 学习韩立刚老师IT运维课程,成为韩立刚老师正式学生,在全国范围为你就近推荐工作。...
- JAVA生成并导出json文件
- jettytomcat对待表单过长问题
- 组策略链接顺序优先级
- [每日一题] 11gOCP 1z0-052 :2013-09-23 Oracle11g 内存参数设置...................................C7...
- Dapr牵手.NET学习笔记:跨物理机负载均衡服务调用
- C# Hashtable和Dictionary区别
- ASP.Net 管道模型 VS Asp.Net Core 管道 总结
- 为什么有些大公司的效率弱爆了?
- BCVP开发者说第一期:Destiny.Core.Flow