介绍

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项目,代码结构如下

源代码地址:https://gitee.com/AZRNG/my-example

迁移代码优先

简单迁移

使用迁移还需要另外安装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之命令行工具的更多相关文章

  1. windows下的命令行工具babun

    什么是babun babun是windows上的一个第三方shell,在这个shell上面你可以使用几乎所有linux,unix上面的命令,他几乎可以取代windows的shell.用官方的题目说就是 ...

  2. 『.NET Core CLI工具文档』(一).NET Core 命令行工具(CLI)

    说明:本文是个人翻译文章,由于个人水平有限,有不对的地方请大家帮忙更正. 原文:.NET Core Command Line Tools 翻译:.NET Core命令行工具 什么是 .NET Core ...

  3. 命令行工具aspnet_regiis.exe实现加密和解密web.config

    命令行工具aspnet_regiis.exe,是一个类似于DOS的命令工具,称之为命令解释器.使用命令行工具加密和解密web.config文件中的数据库连接字符串时,只需要简单的语法命令即可. 加密语 ...

  4. nodejs 编写(添加时间戳)命令行工具 timestamp

    Nodejs除了编写服务器端程序还可以编写命令行工具,如gulp.js就是Nodejs编写的. 接下来我们来实现一个添加时间戳的命令: $ timestamp action https://www.n ...

  5. 如何用Node编写命令行工具

    0. 命令行工具 当全局安装模块之后,我们可以在控制台下执行指定的命令来运行操作,如果npm一样.我把这样的模块称之为命令行工具模块(如理解有偏颇,欢迎指正) 1.用Node编写命令行工具 在Node ...

  6. Orchard中的命令行工具

    在Orchard中提供了一个命令行工具,我们可以使用这个命令行工具创建用户.创建博客.生成代码.配置网站.打包模块等.并且这个命令行工具是可以扩充的,只要我们在自己开发的模块中创建一个Command类 ...

  7. Linux 性能监控之命令行工具

    引言 对于系统和网络管理员来说每天监控和调试Linux系统的性能问题是一项繁重的工作.这些命令行工具可以在各种Linux系统下使用,可以用于监控和查找产生性能问题的原因.这个命令行工具列表提供了足够的 ...

  8. 命令行工具解析Crash文件,dSYM文件进行符号化

    备份   文/爱掏蜂窝的熊(简书作者)原文链接:http://www.jianshu.com/p/0b6f5148dab8著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 序 在日常开发 ...

  9. MySQL 命令行工具之 mysqldump 深入研究

    mysqldump 是MySQL的一个命令行工具,用于逻辑备份.可以将数据库和表的结构,以及表中的数据分别导出成:create database, create table, insert into的 ...

  10. 转:windows下命令行工具

    转自: http://www.cnblogs.com/haochuang/p/5593411.html Windows下CMD不好用,远没有Linux,或者一些SSH工具用起来方便.其实Windows ...

随机推荐

  1. 【验证码逆向专栏】最新某验三代滑块逆向分析,干掉所有的 w 参数!

    声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容.敏感网址.数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 本文章未经许 ...

  2. SignalR系列文章01---MVC项目中创建demo

    1.  新建mvc项目,引入指定的nuget包 2.  新增加一个集成器类添加如下的代码 /// <summary> /// 供客户端调用的服务器端代码 /// </summary& ...

  3. 每日一库:Memcache

    Memcache 是一个高性能.分布式的内存缓存系统,常用于缓存数据库查询结果.API调用结果.页面内容等,以提升应用程序的性能和响应速度.下面详细介绍一些 Memcache 的特点和使用方式: 内存 ...

  4. Windows 10 关闭搜索栏中“热门搜索”的显示。

    Windows 10 关闭搜索栏中"热门搜索"的显示. 任务栏取消"显示搜索突出显示"的设置可能无法取消"热门搜索"的显示, 这就需要您尝试 ...

  5. 从零开始配置vim(27)——代码片段

    我们之前介绍过缩写相关的内容,缩写是可以自动帮我们将缩写的单词展开成一段完整的话.但是代码本身是结构话的,仅仅使用缩写来配置是无法完成自动生成代码这个步骤的.好在我们大量的插件来进行配置.本篇我们将要 ...

  6. 语义检索系统:基于无监督预训练语义索引召回:SimCSE、Diffcse

    基于无监督预训练语义索引召回:SimCSE.Diffcse 语义索引(可通俗理解为向量索引)技术是搜索引擎.推荐系统.广告系统在召回阶段的核心技术之一.语义索引模型的目标是:给定输入文本,模型可以从海 ...

  7. 10.2 调试事件获取DLL装载

    理解了如何通过调试事件输出当前进程中寄存器信息,那么实现加载DLL模块也会变得很容易实现,加载DLL模块主要使用LOAD_DLL_DEBUG_EVENT这个通知事件,该事件可检测进程加载的模块信息,一 ...

  8. 9.0 Python 内置模块应用

    Python 是一种高级.面向对象.通用的编程语言,由Guido van Rossum发明,于1991年首次发布.Python 的设计哲学强调代码的可读性和简洁性,同时也非常适合于大型项目的开发.Py ...

  9. Win32汇编:数组与标志位测试总结

    整理复习汇编语言的知识点,以前在学习<Intel汇编语言程序设计 - 第五版>时没有很认真的整理笔记,主要因为当时是以学习理解为目的没有整理的很详细,这次是我第三次阅读此书,每一次阅读都会 ...

  10. nginx入门之基础配置

    1.配置文件 nginx 的配置文件是 /etc/nginx/nginx.conf,其目录结构大致为: main #全局配置,对全局生效 events { #nginx工作模式配置,配置影响 Ngin ...