一.   反向工程

  反向工程是基于数据库架构,生成的实体类和DbContext类代码的过程,对于Visual Studio开发,建议使用PMC。对于其他开发环境,请选择.NET Core CLI工具(跨平台)。

    (1) 在程序包管理器控制台(PMC)工具中使用命令Scaffold-DbContext 来进行反向工程。

    (2) 在.NET 命令行接口 (CLI) 工具中使用dotnet ef dbcontext scaffold命令来进行反向工程。

  

  1.1 Scaffold-DbContext介绍

    使用Scaffold-DbContext命令生成实体类型时,数据库表必须具有主键,没有主键的表不会被反向工程。下面是PMC下的参数表格介绍,对于CLI的scaffold参数介绍参考官网

  参数

描述

-Connection <String> 数据库的连接字符串。该参数,是必需的。
-Provider <String> 要使用的提供程序。通常,这是NuGet包的名称,例如:Microsoft.EntityFrameworkCore.SqlServer。该参数,是必需的。
-OutputDir <String> 放入文件的目录。路径是相对于项目目录的。
-ContextDir <String> 放置DbContext文件的目录。路径是相对于项目目录的。
-Context <String> DbContext要生成的类的名称。
-Schemas <String []> 用于生成实体类型的表的架构。如果省略此参数,则包括所有架构。例如在sqlserver上默认dbo架构
-Tables <String []> 用于生成实体类型的表。如果省略此参数,则包括所有表。
-DataAnnotations 使用属性配置模型(如果可能)。如果省略此参数,则仅使用fluent API。

-UseDatabaseNames

使用与数据库中显示的完全相同的表和列名称。如果省略此参数,则更改数据库名称以更符合C#名称样式约定。
-Force 覆盖现有文件

二. 命令参数详解

  2.1 必备参数

    -Connection <String>是第一个参数是数据库的连接字符串。 工具将使用此连接字符串来读取数据库架构。-Provider <String>是提供程序名称。

    // PowerShell
    Scaffold-DbContext 'Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Chinook' Microsoft.EntityFrameworkCore.SqlServer     // dotnet
    dotnet ef dbcontext scaffold "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Chinook" Microsoft.EntityFrameworkCore.SqlServer

    

   2.2 指定表和架构

    默认情况下,数据库架构中的所有表都被反向工程到实体类型,可以限制哪些表是反向工程,处理通过指定架构和表。

      -Schemas在 PMC 中的参数和—schema CLI 中的选项可用于包含在架构中的每个表。

      -Tables (PMC) 和--table(CLI) 可用于包括特定的表。

    若要在 PMC 中包含多个表,使用一个数组。若要在 CLI 中包含多个表,请多次指定选项。

    // PowerShell
    Scaffold-DbContext ... -Tables Blog, Post     // dotnet
    dotnet ef dbcontext scaffold ... --table Blog --table Post

  

  2.3 保留名称

         默认情况下,数据库的表名称和列名称是固定的,以便更好地匹配实体名称和属性名称的.NET命名约定。在PMC中指定 -UseDatabaseNames或在CLI中指定 --use-database-names使数据模型中的实体名称和属性名称与数据库中显示的的表和列名称完全相同。如果省略此参数,则可能会更改名称以更符合C#命名约定。

  2.4 Fluent API 或数据注释

    默认情况下,使用Fluent API配置实体类型。在PMC中指定-DataAnnotations或在CLI中指定 --data-annotations的情况下使用数据注释。下面二个代码块, 一个是使用Fluent API配置的,一个是使用数据注释,二者实现功能上一样。

        //Fluent API配置
entity.Property(e => e.Title)
.IsRequired()
.HasMaxLength(); //数据注释
[Required]
[StringLength()]
public string Title { get; set; }

  2.5 DbContext 名称 

    默认情况下,DbContext 上下文名称是(数据库名+ Context后缀) 若要自定义一个DbContext 上下文名称,在PMC中指定 -Context或在CLI中指定--context

  2.6 目录和命名空间

    默认情况下,实体类和DbContext类被搭建到项目的根目录中,并使用项目的默认命名空间。在PMC中指定-OutputDir或在CLI中指定--output-dir指定目录。命名空间将是根命名称+子目录的名称。

下面使用-ContextDir(PMC) 和--context-dir(CLI) 来创建到一个单独的目录(Models),存放实体类和DbContext 类。

        // PowerShell
Scaffold-DbContext ... -ContextDir Data -OutputDir Models
// dotnet
dotnet ef dbcontext scaffold ... --context-dir Data --output-dir Models

  2.7 更新模型

    当更改数据库后,可能需要更新EF Core模型以反映这些更改。如果数据库更改很简单,则最简单的方法是手动对EF Core模型进行更改。例如,重命名表或列,删除列或更新列的类型是在代码中进行的微不足道的更改。如果,数据库更改动作大。一个常见的工作流程是使用-Force(PMC)或--force(CLI)再次从数据库对模型进行反向工程,以使用更新的模型覆盖现有模型。

三.演示

  3.1 初始化反向工程    

    下面来演示一下,关于准备工作和反向工程注意事项这里不在说明,请参考“asp.net core 系列 21 EF现有数据库进行反向工程”。

    本篇使用Visual Studio开发,使用Package Manager Console工具来进行反向工程管理,用PowerShell脚本,并附带上跨平台管理 的dotnet命令,基于EFGetStarted.AspNetCore.NewDb数据库,包括:Blogs和Posts表来演示反向工程。如下图所示:

      

PM> Scaffold-DbContext   "Data Source ={ip};Initial Catalog = EFGetStarted.AspNetCore.NewDb; User ID = hsr;Password =js*2015;" Microsoft.EntityFrameworkCore.SqlServer 
-OutputDir Models -Tables Blogs -Context ReverseDbContext -DataAnnotations -UseDatabaseNames

    上面的一串命令参数中,除了数据库的连接字符串、使用的提供程序、放入文件的目录,其它参数都是可选的。 命令执行成功后,将把DbContext 上下文和实体类(Blogs)存放到Models文件夹中。  使用了 -Context自定义DbContext 上下文、-DataAnnotations数据注释代替Fluent API配置、 -UseDatabaseNames与数据库中显示的的表和列名称完全相同。

        

  

   3.2 更新模型

    下面将Blogs表的Url字段类型长度从Max改为400,新增了Address字段,使用-Force来覆盖现有文件。命令成功后,查看Blogs实体。 

PM> Scaffold-DbContext   "Data Source =172.168.16.75;Initial Catalog = EFGetStarted.AspNetCore.NewDb; User ID = hsr;Password =js*2015;" Microsoft.EntityFrameworkCore.SqlServer   
-OutputDir Models -Tables Blogs -Context ReverseDbContext -DataAnnotations -UseDatabaseNames -Force

四. 其它说明

  4.1 反向工程工作原理

(1) 反向工程开始时读取数据库架构。 它将读取有关表、 列、 约束和索引的信息。

(2) 接下来,它使用的架构信息创建 EF Core 模型。 使用表来创建实体类型;使用列来创建属性;和外键用于创建关系。

(3) 最后,该模型用于生成代码。 相应的实体类型的类、 Fluent API 和数据批注已搭建基架以重新创建相同的模型从您的应用程序中。

  4.2 反向工程哪些不起作用

    (1) 并非所有关于模型的内容都可以使用数据库架构来表示。 例如:有关继承层次结构,拥有类型,表拆分等不存在于数据库架构中。 因此,这些构造将永远不能反向工程处理。

此外,EF Core提供程序可能不支持某些列类型。这些列不会包含在模型中。

    (2) EF Core需要每个实体类型有一个主键。  表没有主键是会反向工程。

    (3) 您可以定义并发标记EF Core 模型以防止两个用户在同一时间更新同一实体中。 有些数据库可以代替这种并发冲突,例如SQL Server 中的行版本控制。但是这也不能反向工程处理。

  

  4.3 反向工程自定义模型

    EF Core生成的代码可随意改变它。只有再次对同一模型进行反向工程时,才会重新生成它。Scaffold代码代表一个可用于访问数据库的模型,但它肯定不是唯一可以使用的模型。

    可以自定义实体类和DbContext类以满足您的需要。例如,可以选择重命名类型和属性,引入继承层次结构或将表拆分为多个实体。您还可以从模型中删除非唯一索引,未使用的序列和导航属性,可选标量属性和约束名称。还可以在单独的文件中使用另一个partial 类添加其他构造函数,方法,属性等。即使您打算再次对模型进行逆向工程,这种方法仍然有效。

  参考文献

     EF反向工程

asp.net core系列 31 EF管理数据库架构--必备知识 反向工程的更多相关文章

  1. asp.net core系列 30 EF管理数据库架构--必备知识 迁移

    一.管理数据库架构概述 EF Core 提供两种主要方法来保持 EF Core 模型和数据库架构同步.一是以 EF Core 模型为基准,二是以数据库为基准. (1)如果希望以 EF Core 模型为 ...

  2. asp.net core 系列 21 EF现有数据库进行反向工程

    一.概述 在上篇中使用EF基于数据模型创建数据库,  本篇继续使用 EF  基于数据库创建数据模型.  实现对已有数据库进行反向工程,来构建数据访问的 ASP.NET Core MVC 应用程序.已有 ...

  3. asp.net core 系列 22 EF(连接字符串,连接复原,DbContext)

    一.连接字符串 在上二篇中,ASP.NET Core 应用程序连接字符串是写死在ConfigureServices代码中,下面介绍通过配置来实现.连接字符串可以存储在 appsettings.json ...

  4. asp.net core 系列 20 EF基于数据模型创建数据库

    一.概述 本章使用 Entity Framework Core 构建执行基本数据访问的 ASP.NET Core MVC 应用程序.使用迁移(migrations)基于数据模型创建数据库,是一种cod ...

  5. asp.net core系列 29 EF模型配置(查询类型,关系数据库建模)

    一.查询类型 此功能是EF Core 2.1中的新功能. EF Core除了实体类型之外,EF Core模型还可以包含查询类型,这些查询类型是针对“未映射到实体类型”的数据获取.比如视图,或只读数据表 ...

  6. asp.net core系列 28 EF模型配置(字段,构造函数,拥有实体类型)

    一. 支持字段 EF允许读取或写入字段而不是一个属性.在使用实体类时,用面向对象的封装来限制或增强应用程序代码对数据访问的语义时,这可能很有用.无法使用数据注释配置.除了约定,还可以使用Fluent ...

  7. asp.net core系列 35 EF保存数据(2) -- EF系列结束

    一.事务 (1) 事务接着上篇继续讲完.如果使用了多种数据访问技术,来访问关系型数据库,则可能希望在这些不同技术所执行的操作之间共享事务.下面示例显示了如何在同一事务中执行 ADO.NET SqlCl ...

  8. asp.net core系列 34 EF保存数据(1)

    一. 基本数据 每个EF上下文实例都有一个 ChangeTracker(更改跟踪器),它负责跟踪需要写入数据库的更改. 当更改实体类的实例时(修改属性,删除实例,新建实例等),这些更改会记录在 Cha ...

  9. asp.net core系列 33 EF查询数据 (2)

    一. 原生SQL查询 接着上篇讲.通过 Entity Framework Core 可以在使用关系数据库时下降到原始 SQL 查询. 在无法使用 LINQ 表达要执行的查询时,或因使用 LINQ 查询 ...

随机推荐

  1. redis对hash进行的相关操作

    redis对hash类型操作的相关命令以及如何在python使用这些命令 redis对hash类型操作的命令: 命令 语法 概述 返回值 Redis Hdel 命令 hdel key field [f ...

  2. 逆向分析一款国外Blackjack Card Counter软件并附上License生成脚本

    没有学过逆向,一时兴起,搞了一下这个小软件,名为“逆向分析”,其实过程非常简单,难登大雅之堂,就当段子看吧.首先介绍一下背景吧.这是一款国外的Blackjack也就是21点算牌软件,我从来不玩牌的,机 ...

  3. 【web安全】-- springboot实现两次MD5加密

    一.为什么要做两次MD5 客户端MD5:HTTP在网络上是使用明文传输,用户输入的明文密码直接在网络上传输太危险.所以,在客户端先进行一次MD5(明文+固定盐). 服务端:服务端接受到后,也不是直接写 ...

  4. Y1E001 HDI二阶板、三阶板

    简单说一下我的理解: 首先我认为几阶就是几次压合,我习惯用几次压合来形容.. 一阶板我认为就是一次压合,只能打一种机械孔,在表层把 一阶板是最普通的的多层板压合方式. 如下图所示,L2~L3为芯板CO ...

  5. 多项式与三角函数求导——BUAA OO 第一单元作业总结

    第一次作业 需求简要说明 针对符合规定的多项式表达式输出其符合格式规定的导函数多项式,格式错误输出WRONG FORMAT! 带符号整数 支持前导0的带符号整数,符号可省略,如: +02.-16> ...

  6. [POJ1273][USACO4.2]Drainage Ditches (网络流最大流)

    题意 网络流最大流模板 思路 EK也不会超时 所以说是一个数据比较水的模板题 但是POJ有点坑,多组数据,而且题目没给 哭得我AC率直掉 代码 用的朴素Dinic #include<cstdio ...

  7. typeof获取变量的数据类型 javascript

    获取变量的数据类型:typeof <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

  8. js 原生: 身份证脱敏、唯一随机字符串uuid、对于高 index 元素的隐藏与显示

    1. 对于高 index 元素的隐藏 与 显示 export const hideIndexEle = (cssStr)=>{ const player = getElementsByCss(c ...

  9. [LeetCode] Push Dominoes 推多米诺骨牌

    There are N dominoes in a line, and we place each domino vertically upright. In the beginning, we si ...

  10. cookie跟session自我介绍

    Cookie是什么? cookie说的直白点就是保存在用户浏览器端的一个键值对,举个例子,你现在登录了京东商城,你把浏览器关闭之后,你再打开京东,你还是可以对你的账户继续操作,已经购买的商品,订单都是 ...