一.   反向工程

  反向工程是基于数据库架构,生成的实体类和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>是提供程序名称。

  1.     // PowerShell
  2.     Scaffold-DbContext 'Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Chinook' Microsoft.EntityFrameworkCore.SqlServer
  3.  
  4.     // dotnet
  5.     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 中包含多个表,请多次指定选项。

  1.     // PowerShell
  2.     Scaffold-DbContext ... -Tables Blog, Post
  3.  
  4.     // dotnet
  5.     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配置的,一个是使用数据注释,二者实现功能上一样。

  1. //Fluent API配置
  2. entity.Property(e => e.Title)
  3. .IsRequired()
  4. .HasMaxLength();
  5.  
  6. //数据注释
  7. [Required]
  8. [StringLength()]
  9. 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 类。

  1. // PowerShell
  2. Scaffold-DbContext ... -ContextDir Data -OutputDir Models
  3. // dotnet
  4. 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表来演示反向工程。如下图所示:

      

  1. 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实体。 

  1. 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. poj 2253 floyd最短路

    题目链接 : http://poj.org/problem?id=2253: 思路:这个题主要是理解了意思就行,题目意思是有两只青蛙和若干块石头,现在已知这些东西的坐标,两只青蛙A坐标和青蛙B坐标是第 ...

  2. gzip解压文件报错

    #tar -xvf jdk-8u131-linux-x64.tar.gz,执行命令后报错如下: gzip: stdin: not in gzip format tar: Child returned ...

  3. pyenv global 设置失败 pyenv local 设置就成功了 不知道啥原因

    dev@PC-20190309QPVT:/mnt/c/data/htdocs/python/flaskr$ pyenv global 3.6.1dev@PC-20190309QPVT:/mnt/c/d ...

  4. [Tips] Git使用经验

    brach 查看目前branch git branch 显示结果: * master *表示这是当前的branch. 建立分支 git branch 分支名 删除分支 git branch -d 分支 ...

  5. 通过游戏来学习CSS的Flex布局

    在复习Flex 布局的时候发现的了几个有趣的小游戏,在这里分享并记录几个有难度的答案 1. Flexbox Froggy 通过调整CSS样式来使各种青蛙回到对应的荷叶上,游戏默认难度为Beginner ...

  6. GDKOI2017滚粗记

    Preface 比赛成绩非常烂,却腐败得非常爽,但是gmh大爷因为和我们腐败,变得更强. 比赛策略有点问题,拼命想正解而没了暴力分 数论题做得比较少,导致只会找规律.知识点需要补充,如AC自动机,启发 ...

  7. 用OleDb导入Excel时提示驱动错误问题解决办法

    导入格式为xls的excel文件,发生了错误 未处理System.Data.OleDb.OleDbException HResult=-2147467259 Message=外部数据库驱动程序 (1) ...

  8. Kafka监控工具kafka-monitor v0.1简要介绍

    Kafka Monitor为Kafka的可视化管理与监控工具,为Kafka的稳定运维提供高效.可靠.稳定的保障,这里主要简单介绍Kafka Monitor的相关功能与页面的介绍: Kafka Moni ...

  9. VS Code 常用插件

    1.Chinese (Simplified) Language Pack for Visual Studio Code              VS Code软件汉化 2.Auto Close Ta ...

  10. 最新版Navicat Premium12 中文破解版 安装激活

    对于PHPer 来说 Navicat Premium  简直就是神器有木有,反正我是这样觉得的,昨天刚更新了最新版本 Navicat Premium 12 ,官网是免费试用14 天的,肿么能行呢,我们 ...