EFCore之命令行工具
介绍
EFCore工具可帮助完成设计数据库时候的开发任务,主要用于通过对数据库架构进行反向工程来管理迁移和搭建DbContext和实体类型。EFCore .NET命令行工具是对跨平台.NET Core CLI工具的扩展,该工具执行需要具有.NET Core SDK(具有 Sdk="Microsoft.NET.Sdk" 的项目或项目文件中的相似项目)的项目,优点是适用于所有平台。
安装工具
使用终端工具执行在任意目录执行下面命令,可以尝试下Terminal终端工具。
# 安装为全局工具
dotnet tool install --global dotnet-ef
# 更新工具
dotnet tool update --global dotnet-ef

验证安装
dotnet ef

参考地址:https://docs.microsoft.com/zh-cn/ef/core/cli/dotnet
创建项目
本次使用的项目为.NetCore WebAPI项目,代码结构如下

迁移代码优先
简单迁移
使用迁移还需要另外安装Nuget包
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="5.0.6" />
在项目文件夹目录下操作终端工具
dotnet ef migrations add Init
// 指定Migrations目录
dotnet ef migrations add Init --output-dir MyMigration
// 指定迁移上下文
dotnet ef migrations add Init --context BlogContext
在 EF Core 5.0及以上 中,才可以使用更改独立于目录的命名空间 --namespace 。
此处Init为迁移名称,该名称要可以表示出当前迁移的内容信息。

生成成功,查看项目内的变化,增加了一个文件夹Migrations

xxxxxx_Init -主迁移文件。包含应用迁移的操作(在up中)和还原迁移所需的操作(在down中)
OpenDbContextModelSnapshot -当前模型的快照。用于确定添加下一迁移时的更改内容。
最好检查下生成的内容是不是我们期望的那样子,有些情况下是需要进行修改的。
如果这个时候,我们又修改了实体类,那么还可以运行命令再次迁移(迁移名称不能相同)
特殊情况
有些特殊情况下生成的迁移文件不是我们预期的那样子,这个时候需要手动修改。
列名重命名
如果实体类中的列明重复了,我们重新迁移,查看生成的文件,比如我将用户表Account修改为UserName,按照官网的说法会生成一下迁移
migrationBuilder.DropColumn(
name: "Account",
table: "User");
migrationBuilder.AddColumn<string>(
name: "UserName",
table: "User",
nullable: true);
实际生成结果为
migrationBuilder.RenameColumn(
name: "Account",
table: "user",
newName: "UserName");
如果生成了先Drop再Add那种进行应用数据库,则用户的帐号都会丢失,所以需要修改我下面这种。(当前现在生成的就是我们想要样子,不过我们还需要谨慎)
还有其他的情况需要注意,可以参考官网
删除迁移
有时候我们在添加迁移后,马上有实体进行改动,这个时候我们并不像再次生成迁移,那么就可以考虑删除上个迁移。
dotnet ef migrations remove
删除迁移后,对实体进行更改,然后再次添加迁移。特殊情况下我们想删除所有的迁移,可以通过删除迁移文件夹并删除数据库来完成。
场景:我们已经生成了许多迁移文件,比较繁琐,我们想将这些迁移文件合并,那么就可以删除迁移文件夹,然后删除数据库的迁移历史表数据,再次生成迁移,根据生成的迁移名称,对迁移历史记录表增加一条对应的数据。
列出迁移
通过下面命令可以查询到我们所有的迁移
dotnet ef migrations list

生成SQL脚本
生成从0到最新迁移的SQL脚本
dotnet ef migrations script

From
生成从给定迁移到最新迁移的SQL脚本(包含最新迁移)
dotnet ef migrations script AddNewTables
From和To
可以从指定的From迁移到指定迁移To的SQL脚本
dotnet ef migrations script AddNewTables AddAuditTable
脚本生成接受以下两个参数,以指示应生成的迁移范围:
- from 迁移应是运行该脚本前应用到数据库的最后一个迁移。 如果未应用任何迁移,请指定
0(默认值)。 - to 迁移是运行该脚本后应用到数据库的最后一个迁移。 它默认为项目中的最后一个迁移。
创建数据库和表
手动执行
让EFCore创建数据库并从迁移中创建表结构,运行命令
dotnet ef database update

如果后续我们实体类结构再有修改,那么还可以先创建迁移文件,然后再生成到数据库。(因为EF已经检测到数据库已存在,会通过对比特殊迁移历史记录表,然后只应用那些新的迁移)。
运行时候执行
//如果当前数据库不存在按照当前 model 创建,如果存在则将数据库调整到和当前 model 匹配
dbContext.Database.Migrate(); // 生产环境使用考虑好数据问题
请勿在 Migrate() 前调用 EnsureCreated()。 EnsureCreated() 会绕过迁移创建架构,这会导致 Migrate() 失败
创建和删除API
EnsureDeleted
EnsureDeleted 方法会删除数据库(如果存在)。 如果你没有相应的权限,则会引发异常。
// Drop the database if it exists
dbContext.Database.EnsureDeleted();
EnsureCreated
如果数据库不存在,EnsureCreated 将创建数据库并初始化数据库架构。 如果存在任何表 (包括其他 DbContext 类) 的表,则不会初始化该架构。
// Create the database if it doesn't exist
dbContext.Database.EnsureCreated();
SQL 脚本
若要获取 EnsureCreated 使用的 SQL,可以使用 GenerateCreateScript 方法。
var sql = dbContext.Database.GenerateCreateScript();
多个 DbContext 类
EnsureCreated 仅在数据库中不存在任何表时有效。 如果需要,您可以编写自己的检查来查看是否需要初始化架构,并使用基础 IRelationalDatabaseCreator 服务来初始化架构。
// TODO: Check whether the schema needs to be initialized
// Initialize the schema for this DbContext
var databaseCreator = dbContext.GetService<IRelationalDatabaseCreator>();
databaseCreator.CreateTables();
参考地址:https://docs.microsoft.com/zh-cn/ef/core/managing-schemas/ensure-created
反向工程数据库优先
dotnet ef dbcontext scaffold "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Chinook" Microsoft.EntityFrameworkCore.SqlServer
配置数据库连接字符串、数据库提供程序
常用配置
--table 指定表反向工程
--context 指定上下文
-context-dir 指定上下文目录
--output-dir Models 指定上下文目录
示例:当前我们有一个数据库文件,需要通过反向工程生成实体类,表结构如下
user

score

项目结构如下

项目目录使用终端执行命令
dotnet ef dbcontext scaffold "Server=localhost;Database=test;Port=3306;charset=utf8;uid=root;pwd=123456;" Pomelo.EntityFrameworkCore.MySql --output-dir Entity --context OpenDbContext

项目结构如下

不过反向工程这种并不会将数据库表注释带到代码中,并且每次执行时候会删除原来的表结构。
参考文档
开始迁移:https://docs.microsoft.com/zh-cn/ef/core/managing-schemas/migrations/managing?tabs=dotnet-core-cli
自定义历史记录表:https://docs.microsoft.com/zh-cn/ef/core/managing-schemas/migrations/history-table
微信公众号

EFCore之命令行工具的更多相关文章
- windows下的命令行工具babun
什么是babun babun是windows上的一个第三方shell,在这个shell上面你可以使用几乎所有linux,unix上面的命令,他几乎可以取代windows的shell.用官方的题目说就是 ...
- 『.NET Core CLI工具文档』(一).NET Core 命令行工具(CLI)
说明:本文是个人翻译文章,由于个人水平有限,有不对的地方请大家帮忙更正. 原文:.NET Core Command Line Tools 翻译:.NET Core命令行工具 什么是 .NET Core ...
- 命令行工具aspnet_regiis.exe实现加密和解密web.config
命令行工具aspnet_regiis.exe,是一个类似于DOS的命令工具,称之为命令解释器.使用命令行工具加密和解密web.config文件中的数据库连接字符串时,只需要简单的语法命令即可. 加密语 ...
- nodejs 编写(添加时间戳)命令行工具 timestamp
Nodejs除了编写服务器端程序还可以编写命令行工具,如gulp.js就是Nodejs编写的. 接下来我们来实现一个添加时间戳的命令: $ timestamp action https://www.n ...
- 如何用Node编写命令行工具
0. 命令行工具 当全局安装模块之后,我们可以在控制台下执行指定的命令来运行操作,如果npm一样.我把这样的模块称之为命令行工具模块(如理解有偏颇,欢迎指正) 1.用Node编写命令行工具 在Node ...
- Orchard中的命令行工具
在Orchard中提供了一个命令行工具,我们可以使用这个命令行工具创建用户.创建博客.生成代码.配置网站.打包模块等.并且这个命令行工具是可以扩充的,只要我们在自己开发的模块中创建一个Command类 ...
- Linux 性能监控之命令行工具
引言 对于系统和网络管理员来说每天监控和调试Linux系统的性能问题是一项繁重的工作.这些命令行工具可以在各种Linux系统下使用,可以用于监控和查找产生性能问题的原因.这个命令行工具列表提供了足够的 ...
- 命令行工具解析Crash文件,dSYM文件进行符号化
备份 文/爱掏蜂窝的熊(简书作者)原文链接:http://www.jianshu.com/p/0b6f5148dab8著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 序 在日常开发 ...
- MySQL 命令行工具之 mysqldump 深入研究
mysqldump 是MySQL的一个命令行工具,用于逻辑备份.可以将数据库和表的结构,以及表中的数据分别导出成:create database, create table, insert into的 ...
- 转:windows下命令行工具
转自: http://www.cnblogs.com/haochuang/p/5593411.html Windows下CMD不好用,远没有Linux,或者一些SSH工具用起来方便.其实Windows ...
随机推荐
- ABP-VNext 用户权限管理系统实战05----扩展授权类型(单点登录)
一.适合场景: 1.我方系统在集成到别人的集成本台时一般是拿别的平台的用户名,在我方系统进行登录 2.我方系统是前后端分离,前端要拿到token 二.解决方案:自定义授权类型 我们知道Identity ...
- kettle(docker版)系列文章01---docker部署
1.准备好kettle的镜像文件放在指定目录解压 docker image load -i /home/pdi/jztwebspoon.tar 2.起容器 docker run -d -p 7777: ...
- minIO系列文章04---windows下安装及在.netcore使用
一.minio下载与启动 下载后会有一个minio.exe文件,放到指定的目录 在该目录下运行:minio.exe server D:\minio\file 出现如下的提示代码启动动成功: 浏览器中 ...
- 多路io复用Select [补档-2023-07-16]
select 2.1 简介 select函数可以用于实现高效的多路复用 I/O,同时处理多个文件描述符的事件,包括监听可读.可写和异常条件,具有阻塞和非阻塞模式,并可以设置超时时间.这使得程序能够 ...
- (python)做题记录||2024.2.4||题目是codewars的【 All Balanced Parentheses】
题目链接:https://www.codewars.com/kata/5426d7a2c2c7784365000783/python 我的解决方案: def balanced_parens(n): # ...
- 小知识:PDML的注意事项补充
关于PDML,之前在 并行,想说爱你不容易中的第一节就介绍过,今天在客户现场协助测试时又遇到几个有关PDML的问题,都蛮典型的,记录一下: 问题1:某存储过程报错ORA-12839. 查看该错误号说明 ...
- 多个Nginx进程运行导致配置加载失效问题
多个Nginx进程运行导致配置加载失效问题 问题描述 在用nginx进行接口代理时,修改配置文件后,重新加载nginx,却发现无论怎么修改配置文件,都无法生效,接口一直无法代理成功.查看了之前做的接口 ...
- 什么是TDD(一)
引子 回顾 虽然我很早以前就听说单元测试,也曾经多次在项目中引入单元测试框架和单元测试的实践为代码质量的提升带来了一丝助力. 但这种方式更多的是从软件调试的角度出发,即将单元测试作为一种测试方法可用性 ...
- JS 数组中找到与目标值最接近的数字,记一次工作中关于二分查找的算法优化
壹 ❀ 引 在最近的工作中,有一个任务是需要修复富文本编辑器字号显示的BUG.大概情况就是,从WPS中复制不同样式的标题.正文到到项目编辑器中,发现没办法设置选中的文本为正文:而且字体字号都显示为默认 ...
- Buffer Queue原理
BufferQueue详解 原理一.BufferQueue 简介在工作中,我们经常会和Surface,ImageReader,ImageWriter BufferQueue打交道,它们之间是什么关系呢 ...