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())和恢复(in Down()所需的操作。

  • 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321924.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

随机挑战#4记录

正题 van♂van♂van♂成记录 题目 P2052−[NOI2011]P2052-[NOI2011]P2052−[NOI2011]道路修建【树】 博客链接:https://blog.csdn.net/Mr_wuyongcong/article/details/102249021 P2796−FacerP2796-FacerP2796−Facer的程序【dpdpdp】 博客链接:https://blog.csdn.net/Mr_wuy…

Visual Studio 2017 15.7 Preview 1 发布

上周 Visual Studio 2017 15.6 版和 Visual Studio for Mac 7.4 版已发布&#xff0c;今天 VS 发布了下一个次要更新的第一个预览&#xff1a;Visual Studio 2017 15.7。本预览的主要亮点包括&#xff1a;提高生产率更好的诊断额外的C 开发改进更好的Android和iOS环境管理通用 …

部署用于生产的Exceptionlees(一个强大易用的日志收集服务)

Exceptionless简介Exceptionless从翻译来看是无异常的意思&#xff0c;其实它收集了很多异常信息。大家可以把他看做事一个非常好用的日志收集服务。还提供了&#xff0c;多组织、多项目。它是一个开源项目&#xff0c;作者也非常的热心&#xff0c;项目地址https://github.com…

ASP.NET Core Web API下事件驱动型架构的实现(四):CQRS架构中聚合与聚合根的实现

在前面两篇文章中&#xff0c;我详细介绍了基本事件系统的实现&#xff0c;包括事件派发和订阅、通过事件处理器执行上下文来解决对象生命周期问题&#xff0c;以及一个基于RabbitMQ的事件总线的实现。接下来对于事件驱动型架构的讨论&#xff0c;就需要结合一个实际的架构案例…

如何看待微软新开源的Service Fabric?

本人曾在Service Fabric (SF)项目中做了几年&#xff0c;这次很兴奋能看到它的开源。短短两天已经有1300多个关注了。我看了一下开源的代码&#xff0c;真是满满的干货&#xff0c;200多万行C代码&#xff0c;所有最核心的协议算法都在里面。但是&#xff0c;不得不承认&#x…

RabbitMQ教程C#版 “Hello World”

先决条件 本教程假定RabbitMQ已经安装&#xff0c;并运行在localhost标准端口&#xff08;5672&#xff09;。如果你使用不同的主机、端口或证书&#xff0c;则需要调整连接设置。从哪里获得帮助 如果您在阅读本教程时遇到困难&#xff0c;可以通过邮件列表联系我们。1.介绍Rab…

牛客小白月赛18-记录

正题 比赛链接:https://ac.nowcoder.com/acm/contest/1221 成绩 总结 好难&#xff0c;就拿了一些水题分 T1:Forsaken喜欢数论\texttt{T1:Forsaken喜欢数论}T1:Forsaken喜欢数论 题目大意 f(i)f(i)f(i)表示iii的最小质因子&#xff0c;求∑i2nf(i)\sum_{i2}^nf(i)∑i2n​f(i…

.NET Core开源API网关 – Ocelot中文文档

Ocelot是一个用.NET Core实现并且开源的API网关&#xff0c;它功能强大&#xff0c;包括了&#xff1a;路由、请求聚合、服务发现、认证、鉴权、限流熔断、并内置了负载均衡器与Service Fabric、Butterfly Tracing集成。这些功能只都只需要简单的配置即可完成&#xff0c;下面我…

ABP前端使用阿里云angular2 UI框架NG-ZORRO分享

一、前言前段时间写博客分享和介绍了阿里云的UI框架NG-ZORRO&#xff08;博客请查看&#xff1a;http://www.cnblogs.com/donaldtdz/p/7892960.html&#xff09;&#xff0c;结合近段时间对.Net开源框架ABP的学习。完成将ABP前端框架替换成阿里云的NG-ZORRO。二、替换说明ABP版…

Prufer序列 生成树定理

Description 在图论中&#xff0c;树的定义是连通且无环的无向图。对于一棵有 nn 个节点且节点从 11 到 nn 编号的树&#xff0c;它的 Prufer 序列是一个唯一的长为 n−2n−2 的标号序列。 Prufer 序列的构造方法&#xff1a;每次删除树中标号最小的叶子节点&#xff08;即度为…

NOI.AC-积木【堆】

正题 题目链接:http://noi.ac/contest/266/problem/794 题目大意 无限多个1∗21*21∗2的砖块交替着 一个砖块会掉落仅当下方两个砖块都掉落&#xff0c;现在抽出nnn个砖块&#xff0c;求掉落多少个砖块。 解题思路 开一个优先队列&#xff0c;若两个连在一起的就把上面那个…

大规模开发团队如何实现DevOps转型? 来自微软全球开发平台工程团队的实践经验

微软全球开发平台工程团队从敏捷到DevOps的转型2013年11月13日&#xff0c;我们宣布了Visual Studio2013&#xff0c;以及微软研发云Visual Studio Online (VSO)的正式商用。紧接着我们经历了一次长达七小时的服务中断。我们的服务运行在一个“弹性扩展单元”中&#xff0c;为大…

野鸡NOI.AC模拟赛【2019.10.26】

前言 截止至2019.10.2614:222019.10.26\ \ \ \ 14:222019.10.26 14:22 成绩 正题 T1:NOI.AC−T1:NOI.AC-T1:NOI.AC−序列【堆】 https://blog.csdn.net/Mr_wuyongcong/article/details/102755906 T2:NOI.AC−T2:NOI.AC-T2:NOI.AC−积木【堆】 https://blog.csdn.net/Mr_wu…

Golang的CSP很酷?其实.NET也可以轻松完成

CSP&#xff08;Communicating sequential processes&#xff09;这东西我一开始以为很简单&#xff0c;后面差了资料发现它独树一帜&#xff0c;自己是一门语言&#xff0c;也是一套理论。这边我不深入的对它做过多的见解&#xff0c;我怕耽误大家_&#xff0c;大家可以看看wi…

SignalR Core尝鲜

要点SignalR Core改用Microsoft.AspNetCore.Sockets&#xff0c;不再依赖HTTP。使用MessagePack序列化格式&#xff0c;支持二进制协议。TypeScript客户端移除了第三方依赖包。支持WebSocket原生客户端&#xff0c;可以使用自己构建的客户端连接到SignalR服务器。伸缩方式更灵活…

2016陕西省ACM 热身体B 种类并查集

Energy 发布时间: 2017年3月27日 11:31 最后更新: 2017年3月27日 18:30 时间限制: 1000ms 内存限制: 256M 描述 人类准备发射载人飞船前往火星。 飞船使用了一种特殊的反物质燃料来作为动力&#xff0c;在飞船的制造期间&#xff0c;同时人类也在从宇宙 的各个地方收集这…

kubernetes实践之运行aspnetcore webapi微服务

1、预备工作unbuntu 16.04 or abovedocker for linuxkubernetes for linux 集群环境2、使用vs2017创建一个web api应用程序&#xff0c;并打包镜像到本地。3、推送本地镜像到docker hub4、编写k8s资源配置文件(yml)hello-world-deployment.yml如下上面replicas部署两个副本实例…

使用.NET Core快速开发一个较正规的命令行应用程序

一般命令行程序包含什么&#xff1f;使用方式帮助信息子命令参数选项帮助信息帮助信息如上&#xff0c;介绍了命令的作用和参数、选项作用。这个是必不可少的。子命令一个应用程序打包了多个功能&#xff0c;这时候就可以使用子命令&#xff0c;比如 dotnet ef migrations&…

Window7 docker安装

一、下载docker toolbox docker-toolbox-windows-docker-toolbox安装包下载_开源镜像站-阿里云 -ce后缀的是免费的版本&#xff0c;其他是收费版本 二、安装 安装完成即可 三、启动docker 双击 Docker Quickstart Terminal启动 其他问题&#xff1a; 启动拉boot2docker镜像失…

aspnetcore.webapi实践k8s健康探测机制 - kubernetes

1、浅析k8s两种健康检查机制Liveness k8s通过liveness来探测微服务的存活性&#xff0c;判断什么时候该重启容器实现自愈。比如访问 Web 服务器时显示 500 内部错误&#xff0c;可能是系统超载&#xff0c;也可能是资源死锁&#xff0c;此时 httpd 进程并没有异常退出&#xff…