惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
News | PayPal Newsroom
Security Archives - TechRepublic
Security Archives - TechRepublic
Hacker News: Ask HN
Hacker News: Ask HN
H
Hacker News: Front Page
Apple Machine Learning Research
Apple Machine Learning Research
TaoSecurity Blog
TaoSecurity Blog
Help Net Security
Help Net Security
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
V
V2EX
Hugging Face - Blog
Hugging Face - Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
人人都是产品经理
人人都是产品经理
博客园 - 三生石上(FineUI控件)
Security Latest
Security Latest
Cloudbric
Cloudbric
WordPress大学
WordPress大学
S
SegmentFault 最新的问题
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Know Your Adversary
Know Your Adversary
A
Arctic Wolf
L
LangChain Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
The GitHub Blog
The GitHub Blog
P
Proofpoint News Feed
W
WeLiveSecurity
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
M
MIT News - Artificial intelligence
Google DeepMind News
Google DeepMind News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The Cloudflare Blog
小众软件
小众软件
NISL@THU
NISL@THU
云风的 BLOG
云风的 BLOG
P
Privacy & Cybersecurity Law Blog
S
Security @ Cisco Blogs
博客园 - 【当耐特】
I
InfoQ
Vercel News
Vercel News
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
P
Proofpoint News Feed
O
OpenAI News
Google DeepMind News
Google DeepMind News
N
News and Events Feed by Topic
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
K
Kaspersky official blog
T
Threat Research - Cisco Blogs
量子位
宝玉的分享
宝玉的分享

博客园 - springsnow

npoi读取word 内容控件 Vue3中 watch、watchEffect 详解 如何使用 Vue SFC Playground toRefs学习 Vue3中如何响应式解构 props useTemplateRef使用 以后台方式启动RealVNC 在VS2022和VS2012共存的电脑上安装VS212扩展注意事项 VS中配置AnkhSVN源代码比较文件排列方式 使用VSCode撰写和发布博客园文章 DBever导入越南文Excel 复制对象中的一部分属性给另一个对象(对象部分属性解构到新对象) 使用metaWebBlog接口实现博客文章同步 水淼·文件批量处理器 如何高效的在博客园上编写MD格式的博客(插件pycnblog,推荐) 自动备份软件 —— Syncovery 7.98s Pro、Enterprise VMware 第三方百度网盘客户端 PanDownload、速盘、panlight 本地电脑视频播放器推荐PotPlayer、KMPlayer
.Net Core3.1上用EFCore的反向工程生成
springsnow · 2022-05-14 · via 博客园 - springsnow

[反向工程-EF Core | Microsoft Docs](https://docs.microsoft.com/zh-
cn/ef/core/managing-schemas/scaffolding?tabs=dotnet-core-cli)

原文:https://www.cnblogs.com/qidakang/p/11302327.html


一、简要步骤

1、第一步

安装以下程序包

  • 安装Entity FrameWork Core SqlServer 3.1
  • 安装Entity FrameWork Core Tools 3.1
  • 安装Entity FrameWork Core Design 3.1

2、第二步

选择默认项目为放Model的项目,在程序包管理控制台 输入:

Scaffold-DbContext '数据库连接字符串' Microsoft.EntityFrameworkCore.SqlServer -o Model -v

  1. -o :表示输出到xxx Model是生成文件以后所在的文件夹的名字,也可以用''代替会直接生成到项目的根目录。
  2. -v: 表示显示错误信息
  3. -Force :更新表
  4. -Tables 表名 :只操作某张表
  5. -Context :Context类名

示例:自动生成MainDB的Context类和UserInfo实体类。

Scaffold-DbContext 'Data Source=.;Initial Catalog=MyDB;User ID=sa;Password=sa123' Microsoft.EntityFrameworkCore.SqlServer 
-o '' -Tables UserInfo -Force -Context MainDB -v

提示:微软官网提示 Sql Server版本必须在2012以上。

二、详细解释

1、反向工程

是实体类型类和一个基于数据库架构的 DbContext 类的基架的过程 。

2、Scaffold-DbContext(数据库上下文脚手架)

使用Scaffold-DbContext(数据库上下文脚手架)指令生成models和context 。

脚手架: 编译器(脚手架)根据程序员制定的规则收成相应的代码,操作数据库(CRUD)

3、语法:

Scaffold-DbContext [-Connection] <String> [-Provider] <String> [-OutputDir
<String>] [-Context <String>]  
[-Schemas <String>] [-Tables <String>] [-DataAnnotations] [-Force] [-Project
<String>]  
[-StartupProject <String>] [-Environment <String>] [<CommonParameters>]

4.参数说明:

  • [-Connection] :数据库连接字符串,将使用此连接字符串来读取数据库架构。
  • [-Provider] :第二个参数是提供程序名称。提供程序名称通常是与提供程序的 NuGet 包名称相同,例如:Pomelo.EntityFrameworkCore.MySql、Microsoft.EntityFrameworkCore.SqlServer
  • [-OutputDir ]:实体类文件存放的目录
  • [-Context ]:创建到一个单独的目录从实体类型类的基架的 DbContext 类。
  • [-Schemas ]:用于包含在架构中的每个表
  • [-Tables ]:指定表,例如:Scaffold-DbContext ... -Tables Artist, Album
  • [-DataAnnotations]:保留名称,使用原始数据库名称,仍将修复无效的.NET 标识符和合成的名称,如导航属性仍将遵循.NET 命名约定
  • [-Force]:更新模型
  • [-Project ]:已搭建基架的 DbContext 类名称将用作后缀的数据库的名称上下文默认情况下。 若要指定一个不同,使用-Context
  • [-StartupProject ]:指定要使用的启动项目。如果省略,则使用解决方案的启动项目
  • [-Environment ]
  • []

5.工作原理

向工程从读取数据库架构开始。 它会读取有关表、列、约束和索引的信息。
接下来,它将使用架构信息创建 EF Core 模型。 使用表创建实体类型;使用列创建属性;使用外键创建关系。
最后,使用模型生成代码。 为相应实体类型类、Fluent API 和数据注释搭建基架,以便从应用重新创建相同的模型。

6.无效情况

  • 并非模型的所有内容都可使用数据库架构表示。 例如,数据库架构中不存在有关继承层次结构固有类型表拆分的信息。 因此,这些构造将永远不会进行反向工程。
  • 此外,EF Core 提供程序可能不支持某些列类型。 这些列不会包含在模型中。
  • 可在 EF Core 模型中定义并发令牌,以防止两个用户同时更新同一实体。 某些数据库使用一种特殊的类型来表示这种类型的列(例如 SQL Server 中的 rowversion),在这种情况下,我们可以对此信息进行反向工程;然而并不会对其他并发令牌进行反向工程。
  • 在 EF Core 6 之前,反向工程不支持 C# 8 可为空引用类型功能 :EF Core 始终生成假定禁用该功能的 C# 代码。 例如,可为 null 的文本列被基架为具有类型string的属性,而不是string?使用用于配置属性的 Fluent API 或数据注释来配置属性是否是必需的。 如果使用较旧版本的 EF Core,仍可以编辑基架代码,并将这些代码替换为 C# 可为空性批注。

7.安装程序集

--MySQL版本:
  MySql.Data.EntityFrameworkCore
  Pomelo.EntityFrameworkCore.MySql
  Microsoft.EntityFrameworkCore.Tools
  Microsoft.VisualStudio.Web.CodeGeneration.Design
--SQLService版本:
  Microsoft.EntityFrameworkCore
  Microsoft.EntityFrameworkCore.SqlServer
  Microsoft.EntityFrameworkCore.Tools
  Microsoft.VisualStudio.Web.CodeGeneration.Design

8.在程序包包管理器控制台 中执行以下语句生成 实体类

--MySQL版本:
第一次生成实体类:
Scaffold-DbContext "Server=127.0.0.1;port=3306;Database=db; User=root;Password=root;" Pomelo.EntityFrameworkCore.MySql -OutputDir Models
更新实体类:
Scaffold-DbContext "Server=127.0.0.1;port=3306;Database=db; User=root;Password=root;" Pomelo.EntityFrameworkCore.MySql -OutputDir Models -Force

--SQLService版本:
第一次生成实体:
Scaffold-DbContext "Server=127.0.0.1;port=3306;Database=db; User=root;Password=root;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models
更新实体类:
Scaffold-DbContext "Server=127.0.0.1;port=3306;Database=db; User=root;Password=root;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Force

注意:

在EF Core 3.0及以上Scaffold-DbContext指令已经可以自动映射数据库中的视图为实体。查询类型表示可从数据库读取但无法更新的数据,它已重命名为无键实体类型 HasNoKey
由于它们非常适用于映射多数场景中的数据库视图,当执行数据库视图反向工程时,EF Core 现在将自动创建无键实体类型。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Names>(entity =>
    {
        entity.HasNoKey();
        entity.ToView("Names");
    });
    modelBuilder.Entity<Things>(entity =>
    {
        entity.HasNoKey();
    });
}

自定义模型

EF Core 生成的代码就是你的代码。 可随意更改。 仅当你再次对同一模型进行反向工程时,才会重新生成该代码。 已搭建基架的代码表示可用于访问数据库的一个模型,但它肯定不是可以使用的唯一模型。

根据需要自定义实体类型类和 DbContext 类。 例如,可选择重命名类型和属性、引入继承层次结构或将表拆分为多个实体。 还可从模型中删除非唯一索引、未使用的序列和导航属性、可选的标量属性和约束名称。

还可添加其他构造函数、方法、属性等。 在单独的文件中使用另一个分部类。 即使打算再次对模型进行反向工程,这种方法也能奏效。

更新模型

对数据库进行更改后,可能需要更新 EF Core 模型以反映这些更改。 如果数据库更改很简单,只需手动对 EF Core 模型进行更改即可。 例如,重命名表或列、删除列或更新列的类型都是在代码中进行的微小更改。

但是,更重要的更改并不容易手动完成。 一种常见的工作流是使用 -Force (PMC) 或 --force (CLI) 再次从数据库对模型进行反向工程,以使用更新的模型覆盖现有模型。

另一个最常请求的功能是能够从数据库更新模型,同时保留重命名、类型层次结构等自定义项。使用问题 #831 跟踪此功能的进度。

警告

如果从数据库中再次对模型进行反向工程,则对这些文件所做的任何更改都将丢失。

提示

如果使用 Visual Studio,EF Core Power Tools 社区扩展(一种构建于 EF Core 命令行工具之上的图形工具)提供了额外的工作流和自定义选项。