freesql 使用Liquid 模板生成实体
前言
最近使用 freesql 进行ORM 操作,官方提供了整个数据库的实体生成,但通过FreeSql.Generator 命令行进行操作,总报错。
而且生成的时候还要继承这边的公共父类,这里就自己用模板写一个单表的实体生成器。
模板
freesql 用的是 RazorEngine.NetCore 作为模板生成器,一直用webapi,不太习惯Razor语法,经过研究发现OrchardCore 推荐用Liquid.Core 类库。
以下就是Liquid的模板
using FreeSql.DataAnnotations;
using Jptlc.Core;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace {{EntityNameSpace}}
{
[JsonObject(MemberSerialization.OptIn), {{TableAttrs}}]
public partial class {{TableName}}: YourOwnFullEntity
{
{% for col in Columns %}
///<summary>
/// {{ col.ColumnCommnet}}
/// </summary>
[JsonProperty, {{ col.ColumnAtts }}]
public {{ col.ColumnCsType }} {{ col.ColumnCsName }} { get; set; }
{% endfor %}
}
}
以上的模板需要的实体字段 为
EntityNameSpace string类型
TableAttrs string类型
Columns 为以下属性
public class ColumnTempleInfo { public string ColumnCommnet { get; set; } public string ColumnAtts { get; set; } public string ColumnCsType { get; set; } public string ColumnCsName { get; set; } }
构建实体
思路,先获取 DbTableInfo 属性,通过方法
var table=_freesql.DbFirst.GetTableByName(codeGenerator.TableName);
后续通过自己写的构建方法构建 Column是属性
private ColumnTempleInfo BuilderColumTemplatInfo(DbColumnInfo dbColumn) { ColumnTempleInfo column = new ColumnTempleInfo(); column.ColumnCsName = GetCsName(dbColumn.Name); column.ColumnCsType = GetCsType(dbColumn); column.ColumnAtts = GetColumnAttribute(dbColumn); column.ColumnCommnet = dbColumn.Comment; return column; }
其实到这里就差不多了,但Fluid 对传入的实体是不起作用,模块中无法正常渲染 {{ col.ColumnCommnet}} 值
因此改用「C# 实体 → 字典」的方式,Fluid 对 Dictionary<string, object> 的支持是原生且无版本差异,所以需要把生成的时候转为Dictionary:
var columnsModelDict = columnWithIdTempleInfos.Select(col => new Dictionary<string, object> { { "ColumnCommnet", col.ColumnCommnet }, { "ColumnAtts", col.ColumnAtts }, { "ColumnCsType", col.ColumnCsType }, { "ColumnCsName", col.ColumnCsName } }).ToList();
结尾
Fluid写法更加简介一些,还可以使用其内置 filter进行一些操作,比如
{{ "title" | capitalize }}
其它的loop循环,if else 也都支持,具体可以查看 Fluid的官方文档查看相应语法。

浙公网安备 33010602011771号