天道酬勤

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的官方文档查看相应语法。

posted @ 2025-12-15 17:41  JulyLuo  阅读(1)  评论(0)    收藏  举报