如何使用 .Net Core 实现数据库迁移 (Database Migration)

news2025/7/22 5:27:32

当我们在编写基于数据库的应用程序时,随着需求的增加和改变,我们需要升级我们的数据库,变更数据库表的字段,当我们的系统的不同版本被部署到了不同的客户那里,在需要给客户升级时,我们如何实现数据库模式 (schema) 的自动升级呢?

.Net Core 提供了 Entity Framework 数据迁移工具。它可以帮助我们自动管理数据库模式,把不同版本的数据库升级到最新版本上。

下面以 asp.net core 服务为例,简要介绍如何使用 .Net Core Entity Framework Database Migration Tools

安装 EF 工具

首先我们需要安装 dotnet-ef,打开命令行,输入如下命令:

dotnet tool install --global dotnet-ef

如果不安装这个工具,我们可能会看到下面的错误:
在这里插入图片描述

创建数据库项目,建立第一个迁移

进入 Visual Studio 创建一个 asp.net core 项目,然后在 program.cs 里加入以下代码:


builder.Services.AddDbContext<YourDbContext>(
    options => options.UseSqlServer("name=ConnectionStrings:DefaultConnection"));

我们的配置文件,应该是这个样子的:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "DefaultConnection": "Server=172.28.64.136;Database=YourDatabaseName;UID=sa;PWD=YourPassword;trustServerCertificate=true"
  }
}

新建一个 YourDbContext 类,它应该类似于下面的代码:

    public class YourDbContext : DbContext
    {
        public YourDbContext (DbContextOptions<EnrollmentContext> options) : base(options)
        {

        }

        public DbSet<Enrollment> Enrollments { get; set; }
    }

下表是我们的第一个数据库表对应的类,为了不绑定固定的数据库,我们使用了通用的标记:

public class Enrollment
    {
        public Guid Id { get; set; }

        #region OTP

        [MaxLength(16)]
        public String? OtpPassword { get; set; }

        public DateTime? Expiration { get; set; }

        #endregion

        #region Player Info

        [MaxLength(64)]
        public string PlayerId { get; set; }

        [MaxLength(128)]
        public string Name { get; set; }

        public DateTime Birthday { get; set; }

        [StringLength(3)]
        public string CountryIsoCode { get; set; }

        [MaxLength(128)]
        public string Email { get; set; }

        #endregion
    }

编译成功后,在项目文件夹下输入下面的命令:

dotnet ef migrations add InitialCreate

命令运行成功后,我们会在项目下发现一个新的文件夹,类似于下面的图片:

在这里插入图片描述

执行迁移升级数据库

当我们的第一个迁移建立好了以后,我们就可以连接数据库创建数据库表了。执行下面的命令升级数据库:

dotnet ef database update

升级成功后就可以看到类似于下面的结果了:
在这里插入图片描述

修改数据库模式,再次升级数据库

我们发现上面的 Enrollment 表没有记录创建时间。我们给它增加一个字段,名字叫 CreatedDate。现在代码被改为如下:

    public class Enrollment
    {
        public Guid Id { get; set; }

        #region OTP

        [MaxLength(16)]
        public String? OtpPassword { get; set; }

        public DateTime? Expiration { get; set; }

        #endregion

        #region Player Info

        [MaxLength(64)]
        public string PlayerId { get; set; }

        [MaxLength(128)]
        public string Name { get; set; }

        public DateTime Birthday { get; set; }

        [StringLength(3)]
        public string CountryIsoCode { get; set; }

        [MaxLength(128)]
        public string Email { get; set; }

        #endregion

        public DateTime CreatedDate { get; set; }
    }

然后运行下面的命令,增加第二个迁移。注意,在修改完上面的代码以后一定要编译我们的项目,否则下面的命令可能侦测不到代码的变化。

dotnet ef migrations add addEnrollmentCreatedDate

完成以后,项目的 migration 文件夹会增加一个 addEnrollmentCreatedDate.cs 文件。
在这里插入图片描述
再次运行下面的命令,我们就可以把代码的变化应用到数据库了:

dotnet ef database update

https://stackoverflow.com/questions/48509470/ef-core-migrations-in-separate-project-issues
dotnet ef --startup-project …/Project.Api/ migrations add InitialModel

常见问题

启动项目和数据库项目分开的问题

如果我们的启动项目 (startup project)和我们的数据库项目是分开建立,那么运行上面的命令可能会出现错误,解决方案是在数据库项目下运行迁移命令,但是需要加上 --startup 参数。类似于下面的示例:

dotnet ef --startup-project ..\EnrollmentApi\  migrations add InitialCreate

SSL Error

如果出现下面的错误,我们需要给数据库连接串加上 trustServerCertificate=true

A connection was successfully established with the server, but then an error occurred during the login process. (provider: SSL Provider, error: 0 - The certificate chain was issued by an authority that is not trusted.)

在这里插入图片描述
https://stackoverflow.com/questions/72190575/asp-net-core-web-api-update-database-failed-due-to-provider-ssl-provider-err

结论

我们可以使用 .Net EF Migrations Tools 来管理我们的数据库变更,这样就可以不用担心客户的数据库版本跟最新版本不一致而导致的变更跟踪太复杂的问题了。

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

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

相关文章

注解和反射

注解和反射注解元注解反射注解 注解和注释的区别 注解 annotation写在程序之中&#xff0c;程序可以识别&#xff0c;做出相应的动作处理&#xff0c;具有检查和约束程序的作用 注释 comment 写在程序之中&#xff0c;供人参考&#xff0c;提示使用&#xff0c;程序会自动忽…

云原生系统学习[Kubernetes]——02 Pod、Deployment、Service

云原生系统学习[Kubernetes]——02 Pod、Deployment、Service [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t9RomXCf-1668486830453)(./assets/image-20221103113345300.png)] 参考资料 什么是YAMLk8s官网文档k8s中文社区k8s-book 学多少&#…

Java:继承和多态

文章目录前言一、继承1.继承概念1.1 继承的语法1.2 父类成员方法1.2.1 子类访问父类的成员变量1.2.2 子类访问父类的成员方法1.3 super、this 关键字1.4 子类构造方法1.5 继承的方式1.6 final 关键字1.7 继承与组合二、多态2.1 多态的概念2.2 多态实现的条件2.3 对重写的认识2.…

Canvas 基础使用

一、基本的画布功能 创建 <canvas>元素时至少要设置 width 和 height 属性&#xff0c;这样才能告诉浏览器在多大面积上绘图。出现在标签包裹里的内容会在浏览器不支持 <canvas>元素时显示。比如&#xff1a; <canvas id"drawing" width"200&q…

PumpkinBook Reading(一)

绪论 基本术语 “算法”是指从数据中学得“模型”的具体方法&#xff0c;“算法”产出的结果称为“模型”&#xff0c;通常是具体的函数或者可抽象地看作为函数。 样本&#xff1a;也称为“示例”&#xff0c;是关于一个事件或对象的描述。因为要想让计算机能对现实生活中的事…

【Python开发】Flask开发实战:个人博客(三)

Flask开发实战&#xff1a;个人博客&#xff08;三&#xff09;在【Python开发】Flask开发实战&#xff1a;个人博客&#xff08;一&#xff09; 中&#xff0c;我们已经完成了 数据库设计、数据准备、模板架构、表单设计、视图函数设计、电子邮件支持 等总体设计的内容。 在【…

公众号裂变拉新,以婴儿辅食为诱饵,实现低成本获客!

大家好~我是娜娜 今天来给大家拆解一个关于食品行业精选公众号增长案例&#xff0c;通过公众号裂变拉新&#xff0c;任务拉新人数5000&#xff0c;留存率达到85%&#xff0c;活动裂变率达到1100.86%。活动数据也还在持续的上升当中。 该公众号的目标人群是新手爸妈&#xff0…

【Java】SpringBoot应用简单示例

SpringBoot应用简单示例SpringBoot应用简单示例HelloWorld搭建项目ResponseBody的作用ComponentScan排除扫描beanSpringBoot集成日志SpringBoot日志初始化原理消息转换器拦截器过滤器操作数据库Spring Data JpaDruid数据源Mybatis-Plus事务处理操作缓存AOP相关概念栗子定时任务…

C语言解析JSON源码

它与 XML 的地位差不多&#xff0c;但就笔者而言&#xff0c;笔者更喜欢 JSON 的风格&#xff0c;因为它更符合我们的思维习惯&#xff0c;同样一份数据&#xff0c;JSON 格式的就是比 XML 要清晰明了一些。 最近笔者需要在 C语言 上解析 JSON 格式&#xff0c;在网上一顿找&am…

XC5VLX30T-2FF323I Virtex-5 LXT FPGA IC 产品参数

概述 Virtex-5 FPGA有-3&#xff0c;-2&#xff0c;-1速度等级&#xff0c;其中-3具有最高的性能。Virtex-5 FPGA直流和交流特性指定为商业和工业级别。除工作温度范围外&#xff0c;除非另有说明&#xff0c;所有直流和交流电气参数对于特定转速等级是相同的(即-1转速等级的工…

一夜登顶GitHub!字节内网数据结构与算法刷题笔记,看完直呼卧槽

网络上流传着一句段子“程序员两条腿&#xff0c;一条是算法&#xff0c;一条是英文&#xff0c;想跑的更远&#xff0c;这两条腿都不能弱”。英文&#xff0c;我们暂且不谈&#xff0c;我们先来谈谈算法。 算法之难&#xff0c;在于将精巧的逻辑&#xff0c;通过合适的数据结…

2 分钟,教你用 Serverless 每天给女朋友自动发土味情话

作者&#xff1a;安可 Serverless 简介 Serverless&#xff0c;中文意思是 “无服务器”&#xff0c;所谓的无服务器并非是说不需要依靠服务器等资源&#xff0c;而是说开发者再也不用过多考虑服务器的问题&#xff0c;可以更专注在产品代码上&#xff0c;同时计算资源也开始…

如何根据自己的SCI论文,匹配适合的期刊? - 易智编译EaseEditing

如何选择合适的目标期刊是需要慎重对待的问题&#xff0c;它决定了你论文的发表速度和被认可度。 可以遵循以下几个步骤来考虑&#xff1a; 1、从你论文的参考文献中选择合适的期刊&#xff08;如果引用文献较少&#xff0c;也可以从引文的参考文献中进行筛选&#xff09;&…

成功解决:ModuleNotFoundError: No module named ‘amp_C‘

在使用transformers时&#xff0c;在调用Trainer的时候遇到了这个问题&#xff0c;原因是apex包有问题&#xff0c; 这里有解决apex安装包的多一些教程 https://blog.csdn.net/Xidian185/article/details/122745427 https://blog.csdn.net/weixin_45225975/article/details/119…

倍福TwinCAT3中使用久同伺服

目录 一、测试设备说明 二、伺服通电和参数设置 1、恢复出厂参数设置 2、恢复出厂&#xff0c;重启后 3、伺服自己点动操作 4、增益、刚度调整 5、伺服零位设定 6、伺服转动一圈编码器脉冲量设定 7、参数保存 三、伺服操作面板 四、TwinCAT3工程配置 1、XML文件 2、…

【元宇宙欧米说】打造艺术与技术构建的交互式数字旅程

Web3 to Earn项目如何扩大应用功能和场景&#xff1f;在Web3时代怎么才能以更新颖、有趣的方式追赶潮流&#xff1f;各Web3领域项目及应用如何进行功能外延以满足用户需求&#xff1f; 11月17日晚上九点&#xff0c;ZenCats项目管理员Fred将以“打造艺术与技术构建的交互式数字…

编码格式转换方法

今天项目上遇到了需要将 SJIS(Shift-JIS) 格式与 UTF8 格式相互转换问题。 首先看一个编码格式问题引发的乱码现象&#xff0c;新建下面的文本文档&#xff0c;然后更名为 test.bat。 echo off echo test chinese character view 测试中文字符显示 pause双击运行 用 chcp 查…

正版授权| iObit Uninstaller 12 Pro 专业卸载器工具

前言 专业的Win系统卸载程序&#xff0c;它可以轻松删除不需要的程序&#xff0c;插件和Windows应用程序&#xff0c;还可以对电脑旧的应用一键更新。安装监视器会检测并记录安装中的所有系统更改&#xff0c;以确保在将来彻底卸载时可以还原所有更改。 功能特点 安装监视器 …

1053 Path of Equal Weight

Given a non-empty tree with root R, and with weight Wi​ assigned to each tree node Ti​. The weight of a path from R to L is defined to be the sum of the weights of all the nodes along the path from R to any leaf node L. Now given any weighted tree, you a…

QT获取计算机硬件信息

一、项目介绍 本文介绍利用QProcess获取计算机的CPU、主板、硬盘等电脑相关硬件信息。 windows提供了“wmic”&#xff08;Windows Management Instrumentation&#xff0c;Windows管理工具&#xff09;&#xff0c;提供了从命令行接口和批命令脚本执行系统管理的支持。可以打…