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
image.png

验证安装

dotnet ef
image.png

参考地址:https://docs.microsoft.com/zh-cn/ef/core/cli/dotnet

创建项目

本次使用的项目为.NetCore WebAPI项目,代码结构如下

image.png

源代码地址: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为迁移名称,该名称要可以表示出当前迁移的内容信息。

image.png

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

image.png

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
image.png

生成SQL脚本

生成从0到最新迁移的SQL脚本

dotnet ef migrations script
image.png

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
image.png

如果后续我们实体类结构再有修改,那么还可以先创建迁移文件,然后再生成到数据库。(因为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

image.png

score

image.png

项目结构如下

image.png

项目目录使用终端执行命令

dotnet ef dbcontext scaffold "Server=localhost;Database=test;Port=3306;charset=utf8;uid=root;pwd=123456;" Pomelo.EntityFrameworkCore.MySql --output-dir Entity  --context OpenDbContext
image.png

项目结构如下

image.png

不过反向工程这种并不会将数据库表注释带到代码中,并且每次执行时候会删除原来的表结构。

参考文档

开始迁移: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

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

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

相关文章

想让数据分析更简便,怎能少了它!

R作为一种统计分析软件&#xff0c;广泛应用于生物、医学、电商、新闻等数据相关行业&#xff0c;是目前主流数据应用软件之一。为了更好地帮助大家了解并快速入门R语言&#xff0c;现超级数学建模携手柯老师以R语言为基础&#xff0c;向大家隆重推出《R语言基础》系列课。柯老…

分类预测 | Matlab实现MTF-CNN-Mutilhead-Attention基于马尔可夫转移场-卷积神经网络融合多头注意力多特征数据分类预测

分类预测 | Matlab实现MTF-CNN-Mutilhead-Attention基于马尔可夫转移场-卷积神经网络融合多头注意力多特征数据分类预测 目录 分类预测 | Matlab实现MTF-CNN-Mutilhead-Attention基于马尔可夫转移场-卷积神经网络融合多头注意力多特征数据分类预测分类效果基本描述程序设计参考…

Akka2使用探索3(Duration 和 Deadline)

2019独角兽企业重金招聘Python工程师标准>>> akka提供了两个关于时长的数据类型&#xff1a;Duration 和 Deadline&#xff0c;比如5秒钟这种含义。 Duration.Inf表示无限&#xff0c;Duration.MinusInf表示负无限 Deadline, 表示一个绝对的时间点&#xff0c;意义是…

C#垃圾回收机制(GC)

GC的前世与今生虽然本文是以.net作为目标来讲述GC&#xff0c;但是GC的概念并非才诞生不久。早在1958年&#xff0c;由鼎鼎大名的图林奖得主John McCarthy所实现的Lisp语言就已经提供了GC的功能&#xff0c;这是GC的第一次出现。Lisp的程序员认为内存管理太重要了&#xff0c;所…

收藏 | EXCEL的36个逆天功能,动画教程

全世界只有3.14 % 的人关注了数据与算法之美1、添加文字下面线条的2种方法2、设置列宽的3种方法3、以cm为单位设置行高跟列宽4、输入0开头数字的2种方法5、快速输入当天日期与时间6、如何输入分数&#xff1f;7、生成序列的3种方法8、快速录入相同内容9、隐藏没有数据区域10、填…

读《中台架构与实现》

最早是在极客时间知道欧创新老师的&#xff0c;我也是他的课程《DDD实战课》的订阅者&#xff0c;后来欧老师基于这门课程做更多的实践与思考&#xff0c;完成了《中台架构与实现&#xff1a;基于 DDD 和微服务》这本书的写作&#xff0c;最近刚好读完了这本书。中台、微服务、…

fedora17的gnome3桌面美化

使用fedora已经有一段时间了,感觉还可以. 今天配置一下gnome的桌面吧. 首先要安装一款工具,这个可以说很必要了,当然,好多的博客里也都提到过,这就是 gnome-tweak-tool yum install gnome-tweak-tool 之后呢, 就可以打开这个软件,在附件里, 中文名字叫做高级设置,英文名字叫做…

全球高智商俱乐部门萨出品,最强大脑达人推荐,让孩子挑战脑力极限,玩出高智商思维!...

我们经常听到“脑力体操”(Mind Gymnastic)&#xff0c;可能大家都不太懂得是什么。通俗地讲&#xff0c;就是时不时&#xff0c;给大脑来点小体操。可以灵活运用大脑&#xff0c;确保头脑是清醒的。门萨试题作为全球公认的“脑力体操”&#xff0c;它不是数学题&#xff0c;对…

linux关机开机命令详解,Linux关机与重启的命令详解

Linux有如下的关机和重启命令:shutdown, reboot, halt, poweroff&#xff0c;那么它们有什么区别呢&#xff1f;shutdown - 建议使用的命令shutdown是最常用也是最安全的关机和重启命令&#xff0c;它会在关机之前调用fsck检查磁盘&#xff0c;其中-h和-r是最常用的参数&#x…

Microsoft Build 2021大会开始后,Develop Blog一系列更新

.NET BLOG发布.NET 6预览版4https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-4/发布**.NET MAUI**预览版4https://devblogs.microsoft.com/dotnet/announcing-net-maui-preview-4/介绍运行时.NET热重载时编辑代码的体验https://devblogs.microsoft.com/dotnet…

数学无用论??我们欠孩子真正的数学阅读

说到数学&#xff0c;我想起了13年一场轰动行业各界的“数学无用论”&#xff01;那时微博上有个话题叫做#让数学滚出高考#&#xff0c;超过7成网友都表示支持&#xff0c;这可怕的比例就能说明在中国由于数学差导致命运被洗牌的真不在少数……甚至大部分人举起了“数学无用论”…

一些积累

为什么80%的码农都做不了架构师&#xff1f;>>> 查看某文件属于哪个RPM包。 我一直使用的是ubuntu&#xff0c;用的是apt-get所以。。&#xff0c;答案是-qf&#xff0c;没有环境没法实验&#xff0c;也不想装rpm在我的ubuntu里。 run level 这个不同的linux发行版…

数据庞大繁杂,如何精简挖掘?

从数据中抽取信息从信息中挖掘知识随着大数据时代的到来&#xff0c;数据挖掘的重要性越发显著。可谓是兵马未至&#xff0c;数据先行。所谓数据挖掘&#xff0c;一般是指从大型数据库中将隐藏的预测信息抽取出来的过程&#xff0c;而更为精确的解释就是“从数据中挖掘知识”。…

Magicodes.IE之总体教程

简介Magicodes.IE&#xff0c;导入导出通用库&#xff0c;支持Dto导入导出、模板导出、花式导出以及动态导出&#xff0c;支持Excel、Csv、Word、Pdf和Html。内容合集Magicodes.IE.AspNetCore之一行代码多格式导出Excel模板导出之动态导出 Magicodes.IE Excel合并行数据导入教程…

关于VC6.0 MSDEV.EXE-应用程序错误0x5003eaed指令引用的0x000...

2019独角兽企业重金招聘Python工程师标准>>> 错误现象&#xff1a;VC6.0中&#xff0c;点击add source file或是add header file,add file to project等菜单&#xff0c;将会出现MSDEV.EXE-应用程序错误&#xff0c;并引起VC6.0的自动关闭。 错误原因&#xff1a;可…

pixelbook安装linux系统,谷歌Pixelbook可以运行Fuchsia操作系统 正测试

【PConline资讯】早在2016年就有消息称&#xff0c;谷歌正在开发一款独立于Android和Chrome OS之外的操作系统 “Fuchsia”。尽管迄今为止谷歌根本没有详细说明这个操作系统&#xff0c;但最新文档指出&#xff0c;谷歌Pixelbook 笔记本可以运行Fuchsia系统。据报道&#xff0c…

AlphaGo Zero又上《Science》封面!谷歌的人工智能又干翻人类了!

全世界只有3.14 % 的人关注了数据与算法之美卢sir在回顾2018年的时候&#xff0c;发现居然遗漏了一个“知识点”——在2018年的最后一个月&#xff0c; AlphaGo Zero登上了世界顶级学术期刊《科学》杂志的封面。Google设计了AlphaGo&#xff08;围棋机器人&#xff09;的事早已…

【译】.NET 6 Preview 4 Released

.NET 6 Preview 4 Released我们很高兴地发布 .NET 6 Preview 4。现在&#xff0c;我们到 .NET 6 正式发布尚有一半。现在是再次浏览.NET 6 全部内容的好时机&#xff0c;就像第一篇预览文章一样。许多功能处于最终形式&#xff0c;而其他功能也将很快发布&#xff0c;因为已经为…

在终端(Terminal)中用颜色显示不同类型文件

2019独角兽企业重金招聘Python工程师标准>>> 对于从Unix/Linux平台转到Mac的同学来说&#xff0c;“终端”是经常要使用的一个工具。不过可能有很多人已经发现了&#xff0c;当我们使用ls命令来显示目录内容的时候&#xff0c;“终端”对于目录、可执行文件等特殊类…

马斯克要干翻人工智能,“神经蕾丝”能让每个人都能当钢铁侠

全世界只有3.14 % 的人关注了数据与算法之美爱因斯坦曾说过&#xff0c;“在一个崇高的目标支持下&#xff0c;不停地工作&#xff0c;即使慢&#xff0c;也一定会获得成功。”这不2019年刚到来&#xff0c;“硅谷钢铁侠”马斯克就定好了“小目标”了——“给我10年时间&#x…