You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Linq2db的T4模板中为列设置DisplayAttribute并获取

在Linq2db T4模板中为列添加DisplayAttribute的实现方法

核心思路

Linq2db默认T4模板没有直接提供DisplayAttribute的设置入口,但可以通过修改模板的代码生成逻辑,将列的Description字段值转换为实体属性上的[Display]特性,从而实现需求。

步骤1:在T4模板中设置列的Description

保持你之前的设置方式,用Description存储显示名称:

LoadSqlServerMetadata("127.0.0.1,1433", "dataBase");
Tables["Contract"].Columns["ContractTermInDays"].Description = "Contract terms in days";
GenerateModel();

步骤2:修改T4模板的代码生成逻辑

找到模板中负责生成实体属性特性的代码块(通常在GenerateEntity方法内),添加生成[Display]特性的逻辑:

  1. 确保模板生成的实体类顶部引入命名空间:
    // 在实体类的using区域添加
    using System.ComponentModel.DataAnnotations;
    
  2. 在生成列属性的循环中,增加Display特性的生成代码:
    foreach (var column in table.Columns)
    {
        // ... 保留原有生成[Column]等特性的代码
        
        // 添加以下代码,根据Description生成Display特性
        if (!string.IsNullOrWhiteSpace(column.Description))
        {
            sb.AppendLine($"    [Display(Name = \"{column.Description.Replace("\"", "\"\"")}\")]");
        }
        
        // ... 保留原有生成属性定义的代码
    }
    
    注:Replace("\"", "\"\"")是为了处理描述文本中包含双引号的情况,避免生成的代码语法错误。

步骤3:通过反射获取DisplayAttribute

生成实体后,使用正确的反射代码获取属性(注意原代码的GetFieds是拼写错误,实体类中通常是属性而非字段):

using System.ComponentModel.DataAnnotations;
using System.Reflection;

// 获取属性的DisplayAttribute
var property = typeof(Contract).GetProperty(nameof(Contract.ContractTermInDays));
var displayAttribute = property?.GetCustomAttribute<DisplayAttribute>();
string displayName = displayAttribute?.Name ?? "默认名称";

补充说明

  • 如果不想使用Description字段,也可以自定义扩展ColumnMetadata类,但修改模板利用现有字段是最简便的方式。
  • Linq2db官方模板未内置该逻辑,需要手动修改模板代码实现。

内容的提问来源于stack exchange,提问作者Александр Кожевников

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 01:37:16