目录

FreeSql介绍

FreeSql.Generator

RazorEngine.NetCore

源码解析

FreeSql.Tools

FreeSql

FreeSql 是功能强大的对象关系映射技术(O/RM),支持 .NETCore 2.1+ 或 .NETFramework 4.0+ 或 Xamarin。

有一个强大的ORM,也方便我们开发一个代码生成器。

一般情况下,我们开发数据库相关的应用,主要分为三种code first、db first、model first

我只用过前二种,

code first,代码优先,数据库都是根据实体类生成,所有的关系,可以是逻辑关联,也可以是物理关联。

DB First: 数据库优先,直接设计表结构,用设计工具生成表,设计主键,外键、索引,关联关系等。

当我们使用DB First时,设计好的数据库,我们怎么生成一些实体类、通用的代码、控制器、服务层、Dto呢。今天我来给大家介绍一下FreeSql项目中的一些工具。当然,不使用此ORM的小伙伴也能使用此工具,因为他是通用。

FreeSql.Generator 命令行方式

通过几行命令,就可实现生成项目中通用的代码结构,不需要复制一段代码后修改,加快开发速度,减少重复劳动,少用一根头发。

由于每个人的项目结构,代码位置各不相同,对于ORM来说,不同的业务逻辑各不相同,所以该项目没有相应的模板,相信使用过Razor的同学一定能实现自己的模板。

1-2年前,我和一个学长也写过代码生成器,这里分享一下当时做项目时的一些模板,https://github.com/i542873057/SJNScaffolding/tree/master/SJNScaffolding.RazorPage/Templates,该项目是基于 . NET Core+Razor Page,由于已离职,所以没有继续维护,这些模板都和ABP相关,当时提取了一些通用的功能,单表操作,可以直接生成前后端功能,只需要在word中按统一的格式写好数据字典的文档,直接复制到系统,即可根据空格,定义类型等方式解析字段。

回到FreeSql.Generator 命令行

怎么使用呢。

安装 dotnet-tool 生成实体类

dotnet tool install -g FreeSql.Generator

新建目录,在地址栏输入 cmd 快速打开命令窗口,输入命令:

FreeSql.Generator --help

我们可以看到

C:\Users\igeekfan\Desktop\code>FreeSql.Generator --help

____ ____ __

/ __/ ____ ___ ___ / __/ ___ _ / /

/ _/ / __// -_)/ -_) _\ \ / _ `/ / /

/_/ /_/ \__/ \__/ /___/ \_, / /_/

/_/

# Github # https://github.com/2881099/FreeSql v1.5.0

使用 FreeSql 快速生成数据库的实体类

更新工具:dotnet tool update -g FreeSql.Generator

# 快速开始 #

> FreeSql.Generator -Razor 1 -NameOptions 0,0,0,0 -NameSpace MyProject -DB "MySql,Data Source=127.0.0.1;..."

-Razor 1 * 选择模板:实体类+特性

-Razor 2 * 选择模板:实体类+特性+导航属性

-Razor "d:\diy.cshtml" * 自定义模板文件

-NameOptions * 总共4个布尔值,分别对应:

# 首字母大写

# 首字母大写,其他小写

# 全部小写

# 下划线转驼峰

-NameSpace * 命名空间

-DB "MySql,Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=数据库;Charset=utf8;SslMode=none;Max pool size=2"

-DB "SqlServer,Data Source=.;Integrated Security=True;Initial Catalog=数据库;Pooling=true;Max Pool Size=2"

-DB "PostgreSQL,Host=192.168.164.10;Port=5432;Username=postgres;Password=123456;Database=数据库;Pooling=true;Maximum Pool Size=2"

-DB "Oracle,user id=user1;password=123456;data source=//127.0.0.1:1521/XE;Pooling=true;Max Pool Size=2"

-DB "Sqlite,Data Source=document.db"

-DB "Dameng,server=127.0.0.1;port=5236;user id=2user;password=123456789;database=2user;poolsize=2"

Dameng 是国产达梦数据库

-Filter Table+View+StoreProcedure

默认生成:表+视图+存储过程

如果不想生成视图和存储过程 -Filter View+StoreProcedure

-Match 正则表达式,只生成匹配的表,如:dbo\.TB_.+

-FileName 文件名,默认:{name}.cs

-Output 保存路径,默认为当前 shell 所在目录

推荐在实体类目录创建 gen.bat,双击它重新所有实体类

更新命令行

dotnet tool update -g FreeSql.Generator

这里lin-cms-dotnetcore这个项目来测试。

数据库表名是下划线,字段也是下划线方式。

-Razor 指定 第一个模板

-NameOptions 0,0,0,1 最后一个1,代表 下划线转驼峰,满足C#命名规则

-NameSpace 指定了命名空间 LinCms.Core.Entities

-DB 就是数据库的相关配置

mysql 本地地址 127.0.0.1 3306端口 用户名 root 密码123456 数据库 lin-cms

-Match book 这样就能只生成book,支持正则表达式,如 -Math lin_user 就会生成以lin_user开头的表。如dbo.TB_.+,会生成以TB开头的表。即只生成匹配的表

执行此命令。

FreeSql.Generator -Razor 1 -NameOptions 0,0,0,1 -NameSpace LinCms.Core.Entities -DB "MySql,Data Source=127.0.0.1;Port=3306;User ID=root;Password=123456;Initial Catalog=lincms;Charset=utf8;SslMode=none;Max pool size=2"

这时候代码已经生成了

其中一个代码 生成如下。这些类是partial ,熟悉C#的同学,应该知道,类的定义使用此关键字,我们能在不同的地方为该类扩展。以防止重新同步数据库的结构时,丢失改动的字段。

namespace LinCms.Core.Entities {

[JsonObject(MemberSerialization.OptIn), Table(Name = "book")]

public partial class Book {

///

/// 主键Id

///

[JsonProperty, Column(Name = "id", IsPrimary = true, IsIdentity = true)]

public long Id { get; set; }

[JsonProperty, Column(Name = "author", DbType = "varchar(20)")]

public string Author { get; set; } = string.Empty;

[JsonProperty, Column(Name = "image", DbType = "varchar(50)")]

public string Image { get; set; } = string.Empty;

//更多xxx

}

}

最终效果图如下

此时会生成二个文件

__重新生成.bat,下次重新点击他就能重新生成实体类了。

FreeSql.Generator -Razor "__razor.cshtml.txt" -NameOptions 1,1,0,1 -NameSpace MyProject -DB "MySql,Data Source=127.0.0.1;Port=3306;User ID=root;Password=123456;Initial Catalog=lincms;Charset=utf8;SslMode=none;Max pool size=2" -FileName "{name}.cs"

上面的命令-Razor 指定了这个txt文件 __razor.cshtml.txt

我们可以定义自己的模板,以生成符合自已业务的的代码,从而实现快速开发。

我们可以看下模板中的文件内容,他就是asp.net下的mvc 结构下的razor后端模板渲染,把这个.txt后缀去掉,就很明了了。对于asp.net mvc的razor,我们可以将控制器下方法的值替换掉cshtml中的值。这个过程是有一个类库在帮我们实现的,叫RazorEngine,不过那个是.net framework下的实践。.NET Framework 下的RazorEngine代码生成介绍

@using FreeSql.DatabaseModel;@{

var gen = Model as RazorModel;

Func GetAttributeString = attr => {

if (string.IsNullOrEmpty(attr)) return null;

return string.Concat(", ", attr.Trim('[', ']'));

};

Func GetDefaultValue = col => {

if (col.CsType == typeof(string)) return " = string.Empty;";

return "";

};

}

//xxx

namespace @gen.NameSpace {

@if (string.IsNullOrEmpty(gen.table.Comment) == false) {

@:///

@:/// @gen.table.Comment.Replace("\r\n", "\n").Replace("\n", "\r\n/// ")

@:///

}

[JsonObject(MemberSerialization.OptIn)@GetAttributeString(gen.GetTableAttribute())]

public partial class @gen.GetCsName(gen.FullTableName) {

@foreach (var col in gen.columns) {

if (string.IsNullOrEmpty(col.Coment) == false) {

@:///

@:/// @col.Coment.Replace("\r\n", "\n").Replace("\n", "\r\n/// ")

@:///

}

@:@("[JsonProperty" + GetAttributeString(gen.GetColumnAttribute(col)) + "]")

@:public @gen.GetCsType(col) @gen.GetCsName(col.Name) { get; set; }@GetDefaultValue(col)

@:

}

}

@gen.GetMySqlEnumSetDefine()

}

RazorEngine.NetCore

到了.NET Core时代,我看了下FreeSql.Generator用的这个类库RazorEngine.NetCore,实现动态操作cshtml,生成需要的文本。

Razor Engine是基于微软Razor解析的模板引擎,它允许你使用Razor语法构建动态模板,你只需要使用Engine的静态方法,Engine.Razor.RunCompile等。

创建一个控制台应用,然后安装包。

Install-Package RazorEngine.NetCore

using RazorEngine;

using RazorEngine.Templating; // For extension methods.

string template = "Hello @Model.Name, welcome to RazorEngine!";

var result = Engine.Razor.RunCompile(template, "templateKey", null, new { Name = "World" });

Console.WriteLine(result);

输出如下内容

Hello World, welcome to RazorEngine!

此处使用的RunCompile方法是扩展方法,您需要引用RazorEngine.Templating命名空间。

The "templateKey" 保持唯一值,比如使用guid值。字符串,并且你可以根据此字符串key重新运行缓存的模板。

如果再次根据此key,可使用原本的模板。

var result = Engine.Razor.Run("templateKey", null, new { Name = "Max" });

会输出如下内容

Hello Max, welcome to RazorEngine!

上面中的RunCompile第三个参数,传null,因为我们第四个参数使用的是匿名类,

根目录创建一个HelloWord.cshtml,要选择属性,->如果较新则复制 内容,

Hello @Model.Name, welcome to RazorEngine!

控制台如下代码。

string templateFilePath = "HelloWorld.cshtml";

var templateFile = File.ReadAllText(templateFilePath);

string templateFileResult = Engine.Razor.RunCompile(templateFile, Guid.NewGuid().ToString(), null, new

{

Name = "World"

});

Console.WriteLine(templateFileResult);

控制台输出

Hello World, welcome to RazorEngine!

使用强类型 CopyRightUserInfo.cs生成一个版权所有

using System;

namespace OvOv.Razor

{

public class CopyRightUserInfo

{

public string UserName { get; set; }

public string EmailAddress { get; set; }

public DateTime CreateTime { get; set; }

public string FileRemark { get; set; }

}

}

根目录创建一个CopyRightTemplate.cshtml,要选择属性,->如果较新则复制 内容,

@{

var gen = Model as OvOv.Razor.CopyRightUserInfo;

}

//=============================================================

// 创建人: @gen.UserName

// 创建时间: @gen.CreateTime

// 邮箱: @gen.EmailAddress

//==============================================================

控制台如下代码。

string copyRightTemplatePath = "CopyRightTemplate.cshtml";

var copyRightTemplate = File.ReadAllText(copyRightTemplatePath);

string copyRightResult = Engine.Razor.RunCompile(copyRightTemplate, Guid.NewGuid().ToString(), typeof(CopyRightUserInfo), new CopyRightUserInfo

{

CreateTime = DateTime.Now,

EmailAddress = "710277267@qq.com",

UserName = "IGeekFan"

});

Console.WriteLine(copyRightResult);

Console.ReadKey();

控制台输出

//=============================================================

// 创建人: IGeekFan

// 创建时间: 2020/6/23 18:14:08

// 邮箱: 710277267@qq.com

//==============================================================

全放到控制台下,输出如下结果。代码生成器最重要的一点解决了,我们就能实现自己的代码生成器,先构建自己的模板,实现输入(命令行,WPF,WEB端及更多),输出(生成文件)。

源码解析

首先这是一个控制台应用,Main(string[] args)可接收多个参数。

处理无参数,--help

处理args数组,解析出所有的参数,如果没有设置,则为默认值。(处理一些参数异常问题)最重要的是根据-Razor,选定对应的模板。

ArgsRazor=""//根据-Razor 1 不是2 还是模板的路径,取出的模板文本值。

var razorId = Guid.NewGuid().ToString("N");

RazorEngine.Engine.Razor.Compile(ArgsRazor, razorId);

根据数据库连接串,取出参数过滤后的表,视图,存储过程

循环数据库的表等,

model为模板中需要的数据

razorId与上文的razorId相同,

sw为生成后的文本保存的值。

var sw = new StringWriter();

var model = new RazorModel(fsql, ArgsNameSpace, ArgsNameOptions, tables, table);

RazorEngine.Engine.Razor.Run(razorId, sw, null, model);

将sw字符串保存生成类.cs文件(根据参数配置生成文件名)

另外生成一个__重新生成.bat,__razor.cshtml.txt,方便后续用户重新生成实体类。

FreeSql.Tools

这是 FreeSql 衍生出来的辅助工具包,内含生成器等功能;作者:mypeng1985

因为这个不兼容mac,linux,所以作者建议使用dotnet-tool 命令行工具生成实体类,从而支持MAC/Linux系统。对于不是使用FreeSql的开发者,也能使用此工具,你只需要修改对应的模板即可。

使用方式:不多介绍。

FreeSql官方群 4336577

预览图

mysql generator 命令_FreeSql.Generator命令行代码生成器是如何实现的相关推荐

  1. mysql 命令 _Mysql常用命令行大全

    7.1 一个建库和建表的实例1 drop database if exists school; //如果存在SCHOOL则删除 create database school; //建立库SCHOOL ...

  2. mysql数据库管理系统模式_MYSQL命令行模式管理MySql的一点心得

    MYSQL命令行模式管理MySql的一点心得 MYSQL命令行模式管理MySql的一点心得 MySql数据库是中小型网站后台数据库的首选,因为它对非商业应用是免费的.网站开发者可以搭建一个" ...

  3. 数据库-Mysql使用学习笔记(命令行及图形化界面)

    目录 环境及软件 安装目录 教程 启动Mysql服务 图形化 命令行 连接和断开服务器 图形化 命令行 SQL语句 介绍 分类 自带表介绍 注释 数据库的添加与删除 表的添加与删除 查询语法 基础查询 ...

  4. mysql导入指定数据库_mysql命令行导入sql文件到指定数据库的方法

    欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入 第四章: ls 有一些我们常用的参数, 比如我们要知道当前目录的所有内容, 包括隐藏文件夹和文件和所有属性, 例 [roo ...

  5. sql+php修改mysql结构,MSSQL_修改SQL-SERVER数据库表结构的SQL命令附sql命令行修改数据库,具体不废话了,请看下文代码 - phpStudy...

    修改SQL-SERVER数据库表结构的SQL命令附sql命令行修改数据库 具体不废话了,请看下文代码详细说明吧. 向表中增加一个 varchar 列: ALTER TABLE distributors ...

  6. mysql切换系统盘命令_mysql常用命令

    一.连接MySQL 格式: mysql -h主机地址 -u用户名 -p用户密码 1.例1:连接到本机上的MYSQL. 首先在打开DOS窗口,然后进入目录 mysqlbin,再键入命令mysql -ur ...

  7. 二、MySql优化七个查询命令特征

    MySql查询语句中七个查询命令特征(根据七个查询执行优先级) 一.FROM     [作用]: 将硬盘上的表文件加载到内存中,生成一个全新的临时表 定位内存中已经存在的临时表 [注意]: 在一个查询 ...

  8. MySQL基础之控制台常用命令

    文章目录 1.前言 2.配置环境变量 3.常用命令 3.1 mysql服务的开启与关闭 3.2 查看端口用用情况 3.3 MySQL服务端的进入与退出 3.4 数据库相关操作 3.4.1 查看当前所有 ...

  9. php mysql source_详解MySQL数据库中有关source命令

    这篇文章主要介绍了MySQL 数据库 source 命令详解及实例的相关资料,需要的朋友可以参考下 MySQL 数据库 source 命令详解及实例 MySQL 数据库 source 命令,该命令是数 ...

最新文章

  1. linux红帽网页中文乱码解决,【linux学习笔记】安装redhat时中文显示乱码(小方框)解决方法...
  2. encoder-decoder 注意力机制整理名望所
  3. OCS 如何在数据库直接给用户增加联络人
  4. 正则-元字符 注意正则表达式中间不要随意加空格
  5. oracle中ocr和asm的关系,迁移OCR和VotingDisk并删除原ASM磁盘组
  6. 基于easyui开发Web版Activiti流程定制器详解(三)——页面结构(上)
  7. 震惊!丧心病狂的夕小瑶推出新一轮写作计划!
  8. Java设计模式(二) 观察者模式
  9. vs.net c# 安装、注册windows service服务,判断服务是否存在,是否启动
  10. java 相等测试与继承
  11. linux 启动禁用显卡驱动,Linux secure boot(安全启动)时添加Nvidia显卡驱动
  12. 会计科目(定义,分类)
  13. http错误404.3解决办法
  14. shell 中柏开机显示efi_公司的中柏笔记本,出现开机无法启动,发出滴滴-滴滴滴-滴的声音(前面的-为停顿),求助大虾们有什么办法解决,谢谢了,我的保修单弄丢了不知道自己能不能解决。...
  15. java版精简搜狗皮肤
  16. 网银“交易密码丢失U盾作废”引质疑
  17. 【论文笔记】PlenOctrees for Real-time Rendering of Neural Radiance Fields
  18. 华为2018年服务器销售额,2018Q4华为服务器收入全球第三 同比增45.9%
  19. 自己的第一个windows程序
  20. mac与mac传输文件_Mac上传输的最佳选择

热门文章

  1. 锁定运用计算机,终极:如何锁定您不知道的Win10键盘快捷键,带您轻松使用计算机,值得收藏...
  2. c#反射入门篇(Reflection)——PropertyInfo 发现属性
  3. idea 编译项目的时候遇到:java: 无法访问com.sun.beans.introspect.PropertyInfo
  4. 表单元素input type=”hidden”的作用
  5. VMWare win10 安装程序无法创建新的系统分区也无法定位现有分区的解决方法
  6. 2020年计算机高级职称,2020年计算机软考高级哪个好考
  7. latex插入编号{itemize}和{enumerate}
  8. 树莓派如何设置静态IP
  9. 安德鲁•杰克逊政府的金融政策
  10. ubuntu 20.04 安装 微信,QQ等客户端,一键安装,亲测成功,最新更新,优麒麟