﻿优化背景：
    1、之前我们的从数据库自动生成实体对照模型，依赖于T4模板,同时T4模板里面的针对对应数据库获取信息的方法是自己写的，其实没必要，官方有反向生成工具，也是用的T4模板，现在可以自定义了
    2、如果我们想用pgsql  orcal  mysql，按照之前的方法就要针对这些数据库进行适配，太麻烦
    3、本身不同数据库官方提供了不同反向工程的库，利用命令行就可以根据数据库的定义生成实体
       Microsoft.EntityFrameworkCore.SqlServer   mssql 
       Npgsql.EntityFrameworkCore.PostgreSQL    pgsql
       Pomelo.EntityFrameworkCore.MySql         mysql
       Oracle.EntityFrameworkCore               Oracle
    4、微软官方针对这些不同的库，生成实体的T4模板是一样的，而且也提供了自定义模板的功能，我们可以在官方模板的基础上进行自定义，以适配属于我们项目的实体生成
        1）继承我们自己的审计基类
        2）生成的时候过滤Id 以及我们自己的审计字段
        3）为适配多种数据库，自定义指定字符串长度（默认长度不用标注，特殊长度才标注）
        4）为适配多种数据库，自定义精度特性，统一处理

程序包管理控制台命令行工具使用：

参数说明：
-o  模型输出目录
-c  指定数据库上下文名字
-d  使用数据注解  不指定，默认是fluentAPI
-t  指定要生成的表名
-p  指定项目名字 （包含上下文，并且产生迁移文件的项目）

备注： 因为是从数据库反向生成实体，所以会默认生成dbcontext ,每次生成想要的实体后，删除指定的名称context即可
       针对字符串类型，我们避免string字段 数据库存储null  string? 数据库才存储null（除非有合理的理由），这样可以避免代码里面用string 变量，总是要判断是否为null
       同时在保存数据库实体的时候，在赋值审计字段的时候，针对string 类型的变量，如果当前值是null,设置为""字符串，也可以避免实体定义的每个string 变量赋值默认值，有时候会忘记

Scaffold-DbContext "连接字符串" 数据库提供程序包 -Project 项目名称 -OutputDir 输出目录 -Context "生成的上下文名称" -DataAnnotations  -Tables 表1, 表2 

方式1：
Scaffold-DbContext "Server=106.14.89.110,1435;Database=Test_IRC;User ID=sa;Password=xc@123456;TrustServerCertificate=true" Microsoft.EntityFrameworkCore.SqlServer -Project IRaCIS.Core.Test -OutputDir GenerateContextModelFolder -Context "TempContext" -DataAnnotations  -Tables Dictionary, Site 

方式2： 多个表 -t  Subject -t SubjectVisit
dotnet ef dbcontext scaffold "Server=106.14.89.110,1435;Database=Test_IRC;User ID=sa;Password=xc@123456;TrustServerCertificate=true" Microsoft.EntityFrameworkCore.SqlServer -p IRaCIS.Core.Test  -d  -o GenerateContextModelFolder -c "TempContext" -t Dictionary  -t Site


开发者PowerShell || 程序包管理控制台命令行  使用：
通过Liquid模板生成基础视图模型、服务接口、服务实现基本方法（必须先有数据库实体模型，否则视图模型无法生成）
 dotnet run --project IRaCIS.Core.Test -- Dictionary Site


自动脚本方便执行两句脚本：

./IRaCIS.Core.Test/AutoTemplatel.ps1 -Tables Dictionary, Site  

如果不能执行ps1脚本，管理员设置：Set-ExecutionPolicy -ExecutionPolicy RemoteSigned