.Net Core3.1上用EFCore的反向工程生成

[反向工程-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 命令行工具之上的图形工具)提供了额外的工作流和自定义选项。

posted on 2022-05-14 11:29  springsnow  阅读(604)  评论(0编辑  收藏  举报

导航