EFCore之命令行工具

安装工具

使用终端工具执行在任意目录执行下面命令,可以尝试下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

USB Microphone https://www.soft-voice.com/

Wooden Speakers  https://www.zeshuiplatform.com/

亚马逊测评 www.yisuping.cn

深圳网站建设www.sz886.com

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容