长沙科技网站设计哪家专业苏州网络seo
news/
2025/9/26 22:12:21/
文章来源:
长沙科技网站设计哪家专业,苏州网络seo,河南软件开发,企企业业网网站站建建设设目录FreeSql介绍FreeSql.GeneratorRazorEngine.NetCore源码解析FreeSql.ToolsFreeSqlFreeSql 是功能强大的对象关系映射技术(O/RM)#xff0c;支持 .NETCore 2.1 或 .NETFramework 4.0 或 Xamarin。有一个强大的ORM#xff0c;也方便我们开发一个代码生成器。一般情况下… 目录FreeSql介绍FreeSql.GeneratorRazorEngine.NetCore源码解析FreeSql.ToolsFreeSqlFreeSql 是功能强大的对象关系映射技术(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 CoreRazor Page,由于已离职所以没有继续维护这些模板都和ABP相关当时提取了一些通用的功能单表操作可以直接生成前后端功能只需要在word中按统一的格式写好数据字典的文档直接复制到系统即可根据空格定义类型等方式解析字段。回到FreeSql.Generator 命令行对于此工具的使用可参考 https://github.com/dotnetcore/FreeSql/wiki/DbFirst源码位置 https://github.com/dotnetcore/FreeSql/tree/master/Extensions/FreeSql.Generator前提是本地安装了.net core 3.1 的sdk.怎么使用呢。安装 dotnet-tool 生成实体类dotnet tool install -g FreeSql.Generator
新建目录在地址栏输入 cmd 快速打开命令窗口输入命令FreeSql.Generator --help
我们可以看到C:\Users\igeekfan\Desktop\codeFreeSql.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 Source127.0.0.1;...-Razor 1 * 选择模板实体类特性-Razor 2 * 选择模板实体类特性导航属性-Razor d:\diy.cshtml * 自定义模板文件-NameOptions * 总共4个布尔值分别对应# 首字母大写# 首字母大写,其他小写# 全部小写# 下划线转驼峰-NameSpace * 命名空间-DB MySql,Data Source127.0.0.1;Port3306;User IDroot;Passwordroot;Initial Catalog数据库;Charsetutf8;SslModenone;Max pool size2-DB SqlServer,Data Source.;Integrated SecurityTrue;Initial Catalog数据库;Poolingtrue;Max Pool Size2-DB PostgreSQL,Host192.168.164.10;Port5432;Usernamepostgres;Password123456;Database数据库;Poolingtrue;Maximum Pool Size2-DB Oracle,user iduser1;password123456;data source//127.0.0.1:1521/XE;Poolingtrue;Max Pool Size2-DB Sqlite,Data Sourcedocument.db-DB Dameng,server127.0.0.1;port5236;user id2user;password123456789;database2user;poolsize2Dameng 是国产达梦数据库-Filter TableViewStoreProcedure默认生成表视图存储过程如果不想生成视图和存储过程 -Filter ViewStoreProcedure-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 Source127.0.0.1;Port3306;User IDroot;Password123456;Initial Cataloglincms;Charsetutf8;SslModenone;Max pool size2
这时候代码已经生成了其中一个代码 生成如下。这些类是partial 熟悉C#的同学应该知道类的定义使用此关键字我们能在不同的地方为该类扩展。以防止重新同步数据库的结构时丢失改动的字段。namespace LinCms.Core.Entities {[JsonObject(MemberSerialization.OptIn), Table(Name book)]public partial class Book {/// summary/// 主键Id/// /summary[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 Source127.0.0.1;Port3306;User IDroot;Password123456;Initial Cataloglincms;Charsetutf8;SslModenone;Max pool size2 -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;Funcstring, string GetAttributeString attr {if (string.IsNullOrEmpty(attr)) return null;return string.Concat(, , attr.Trim([, ]));
};
FuncDbColumnInfo, string GetDefaultValue col {if (col.CsType typeof(string)) return string.Empty;;return ;
};
}
//xxx
namespace gen.NameSpace {if (string.IsNullOrEmpty(gen.table.Comment) false) {:/// summary:/// gen.table.Comment.Replace(\r\n, \n).Replace(\n, \r\n /// ):/// /summary
}[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) {:/// summary:/// col.Coment.Replace(\r\n, \n).Replace(\n, \r\n /// ):/// /summary}:([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 710277267qq.com,UserName IGeekFan
});
Console.WriteLine(copyRightResult);Console.ReadKey();
控制台输出//
// 创建人: IGeekFan
// 创建时间: 2020/6/23 18:14:08
// 邮箱 710277267qq.com
//
全放到控制台下输出如下结果。代码生成器最重要的一点解决了我们就能实现自己的代码生成器先构建自己的模板实现输入命令行WPFWEB端及更多输出生成文件。以上源码已放到示例代码中 https://github.com/luoyunchong/dotnetcore-examples/blob/master/aspnetcore-freesql/OvOv.Razor/Program.cs源码解析首先这是一个控制台应用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的开发者也能使用此工具你只需要修改对应的模板即可。使用方式不多介绍。https://github.com/2881099/Freesql.tools分为WPF WinForm DSkin 版本套网页看了下代码底层生成代码逻辑也是用的RazorEngine .NET Framework 下的RazorEngine代码生成介绍预览图
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/916882.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!