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,一经查实,立即删除!

相关文章

A Boring Game

题面&#xff1a;Jeff has got 2n2n real numbers a1,a2,…,a2na1, a2, …, a2n. He decides to adjust the numbers. Namely, Jeff consecutively executes nn operations, each of them goes as follows:choose indexes ii and jj (i≠ji ≠ j) that havent been chosen…

随机挑战#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…

K8S Learning(4)——Namespace

一、Namespace简介 Namespace是kubernetes系统中的一种非常重要资源&#xff0c;它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。 默认情况下&#xff0c;kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中&#xff0c;可能不想让两个Pod之间进…

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环境管理通用 …

P4395-[BOI2003]Gem气垫车【树形dp,四色定理】

正题 题目链接:https://www.luogu.org/problem/P4395 题目大意 一棵树&#xff0c;每个节点填一个正整数&#xff0c;要求相邻的节点数字不同&#xff0c;求所有节点的和最小。 解题思路 根据四色定理&#xff0c;我们可以知道用四个数字一定可以填完&#xff0c;所有填的数…

等差区间 线段树+GCD

Description 已知一个长度为 nn 的数组 a[1],a[2],…,a[n]a[1],a[2],…,a[n]&#xff0c;我们进行 qq 次询问&#xff0c;每次询问区间 a[l],a[l1],…,a[r−1],a[r]a[l],a[l1],…,a[r−1],a[r]&#xff0c;数字从小到大排列后&#xff0c;是否会形成等差数列。等差数列的定义为…

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

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

K8S Learning(5)——Pod

一、Pod简介 Pod是kubernetes集群进行管理的最小单元&#xff0c;程序要运行必须部署在容器中&#xff0c;而容器必须存在于Pod中。Pod可以认为是容器的封装&#xff0c;一个Pod中可以存在一个或者多个容器。 kubernetes在集群启动之后&#xff0c;集群中的各个组件也都是以Po…

P4880-抓住czx【最短路】

正题 题目大意:https://www.luogu.org/problem/P4880 题目大意 一个无向图&#xff0c;从bbb点出发&#xff0c;目标在eee点&#xff0c;TTT次移动在第aia_iai​时移动到点xix_ixi​。求最早多少能到。 解题思路 若一个点我们到不了我们就不用管它了&#xff0c;所以我们只要…

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

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

K8S Learning(6)——Label

一、Label简介 Label是kubernetes系统中的一个重要概念。它的作用就是在资源上添加标识&#xff0c;用来对它们进行区分和选择。 Label的特点&#xff1a; 一个Label会以key/value键值对的形式附加到各种对象上&#xff0c;如Node、Pod、Service等等 一个资源对象可以定义任…

P3531-[POI2012]LIT-Letters【逆序对,树状数组】

正题 题目大意:https://www.luogu.org/problem/P3531 题目大意 两个由相同字符组成的字符串&#xff0c;每次可以交换相邻的两个字符&#xff0c;求最少交换次数使这两个字符串相同。 解题思路 我们拿第二个字符在第一个字符串对应的位置作为值求逆序对数量即可。 注意的是…

水题 矩阵快速幂

Description 函数 f:Z→Zf:Z→Z。已知 f(1)&#xff0c;f(2)f(1)&#xff0c;f(2) 的值&#xff0c;且对于任意 x>1x>1&#xff0c;有 f(x1)f(x)f(x−1)sin(πx2)f(x1)f(x)f(x−1)sin⁡(πx2)。 求 f(n)f(n) 的值。 Input 多组数据。&#xff08;数据组数 T≤100T≤100&a…

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

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

K8S Learning(7)—— Deployment

一、Deployment简介 在kubernetes中&#xff0c;Pod是最小的控制单元&#xff0c;但是kubernetes很少直接控制Pod&#xff0c;一般都是通过Pod控制器来完成的。Pod控制器用于pod的管理&#xff0c;确保pod资源符合预期的状态&#xff0c;当pod的资源出现故障时&#xff0c;会尝…

P1477-[NOI2008]假面舞会【构图,dfs,gcd】

正题 题目链接:https://www.luogu.org/problem/P1477 题目大意 一张有向图&#xff0c;分为zzz类点&#xff0c;对于每条边要么是iii类连向i1i1i1类&#xff0c;要么是kkk类连向111类(k≥3k\geq 3k≥3)&#xff0c;求zzz的最小值和最大值(不给出kkk) 解题思路 首先不考虑环&…

公共子串 字符串哈希

You are given two long strings AA and BB. They are comprised of lowercase letters. You should compute how many suffixes of AA are the prefixes of BB. Input In the first line is a number TT (0<T≤1000<T≤100) , indicating the cases following.In the ne…

RabbitMQ教程C#版 “Hello World”

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

K8S Learning(8)—— Service

一、Service简介 利用Deployment来创建一组Pod来提供具有高可用性的服务&#xff0c;每个Pod都会分配一个单独的Pod IP&#xff0c;却存在以下两个问题&#xff1a; Pod IP 会随着Pod的重建产生变化 Pod IP 仅仅是集群内可见的虚拟IP&#xff0c;外部无法访问 对于访问这个服…

牛客小白月赛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…