首页 > 数据库 >Net6 EFCore 基于MSSQL & T4 自动生成字段注释

Net6 EFCore 基于MSSQL & T4 自动生成字段注释

时间:2024-06-18 14:31:51浏览次数:24  
标签:.+ T4 itemDic Value 注释 EFCore var Net6 entityName

文件模板代码

<#@ template language="C#" #>
<#@ output extension=".cs" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Text.RegularExpressions" #>


<#
    // 设置生成的文件路径
    string dbContextFilePath = @"XXX\Models\DbContext.cs";
    string entityFolderPath = @"XXX\Models";// 实体类文件所在文件夹路径

    string dbContextCode = File.ReadAllText(dbContextFilePath);

    var entityDic = new Dictionary<string, Dictionary<string, string>>();
    //  正则匹配:表名,表注释
    var entityMatches = Regex.Matches(dbContextCode, @"modelBuilder\.Entity<(.+?)>\(entity =>(.+?)entity\.HasComment\(""(.+?)""\);(.+?)\}", RegexOptions.Singleline);
    foreach (Match matchEntity in entityMatches)
    {
        var entityName = matchEntity.Groups[1].Value;
        var itemDic = new Dictionary<string, string> {
            { $"Table - {entityName}", matchEntity.Groups[3].Value}
        };
        entityDic.Add(entityName, itemDic);

        //  正则匹配:字典名,字典注释
        var propertyCode = matchEntity.Groups[4].Value;
        var propertyMatches = Regex.Matches(propertyCode, @"entity\.Property\(e => e\.(.+?)\)(.+?)\.HasComment\(""(.+?)""\);", RegexOptions.Singleline);
        foreach (Match matchProperty in propertyMatches)
        {
            itemDic.Add(matchProperty.Groups[1].Value, matchProperty.Groups[3].Value);
        }
    }

    // 获取实体类文件夹中的所有文件路径
    string[] entityFiles = Directory.GetFiles(entityFolderPath, "*.cs");

    // 遍历所有实体类文件,为每个文件添加注释
    foreach (var entityFile in entityFiles)
    {
        // 排除dbContext文件
        if(entityFile == dbContextFilePath) continue;
        string entityCode = File.ReadAllText(entityFile);
        // 过滤不存在的字典值
        var entityName = Path.GetFileNameWithoutExtension(entityFile);
        if (!entityDic.ContainsKey(entityName)) continue;
        var itemDic = entityDic[entityName];

        //  匹配实体类的注释
        var updatedEntityCode = entityCode.Replace("    public partial class ", $@"    /// <summary>
    /// {itemDic[$"Table - {entityName}"]}
    /// </summary>
    public partial class ");

        // 匹配实体类的属性并检查是否有注释
        updatedEntityCode = Regex.Replace(updatedEntityCode, @"public (.+?) (.+?) \{ get; set; \}", match => 
        {
            var propertyDeclaration = match.Value.Trim();
            var itemPropertyCode = match.Groups[2].Value;
            if (itemDic.ContainsKey(itemPropertyCode))
            {
return $@"
        /// <summary>
        /// {itemDic[itemPropertyCode]}
        /// </summary>
        {propertyDeclaration}";
            }
            return propertyDeclaration; // 已有注释则不修改
        });

        // 输出更新后的实体类代码
        //Write(updatedEntityCode);
        // 写入更新后的实体类代码到同一文件中
        File.WriteAllText(entityFile, updatedEntityCode);
    }
#>

 

Remind

1.基于现有的DbContext文件,如果DbFirst生成结果有变化,需要重新调整正则
2.没有过滤重复生成,多次保存会导致注释重复

 

Reference

NetCore EFCore DbFirst 连接 MsSql

标签:.+,T4,itemDic,Value,注释,EFCore,var,Net6,entityName
From: https://www.cnblogs.com/CRobot/p/18254283

相关文章

  • 小北Chat GPT4o 文生图初体验~
     前言    在人工智能领域中,生成图像和文本的技术一直在不断进步。OpenAI的ChatGPT-4结合DALL-E技术,为用户提供了一种全新的创作体验——通过文字生成图像。在这篇博客中,小北将分享几次与ChatGPT-4合作的创作过程,展示从文字描述到图像生成的神奇之旅~正文1.对牛弹......
  • 跟着杨中科学习(七)EFCore(五)
    EFCore的异步异步方法大部分是定义在Microsoft.EntityFrameworkCore这个命名空间下EntityFrameworkQueryableExtensions等类中的扩展方法,记得using。如何异步遍历IQueryable使用ToListAsync()、ToArrayAsync()。但是注意结果集不要太大。foreach(varainawaitctx.Arti......
  • LKT4304-物联网数据传输安全解决方案
    随着互联网、智能终端等相关行业的飞速发展,对终端产品远程控制的需求在人们生活中越来越普遍。如何保障后台与终端产品之间数据安全交互、不被篡改、不被盗取成为产品安全性的主要问题。密钥管理和分配:方案中使用的对称密钥可以提前设置或采用临时生成方式;平台和终端存储自身的......
  • WPF修改MessageBox样式(.NET6版本)
    一、问题场景使用HandyControl简写HC作为基础UI组件库时,希望系统中所有的MessageBox样式都使用HC的MessageBox,常规操作如下:在对应的xxxx.cs顶部使用using指定特定类的命名空间。usingMessageBox=HandyControl.Controls.MessageBox;这样,当前页面对应的MessageBox就都......
  • 移动端超超超详细知识点总结(Part4)
    rem基础1.rem单位rem(rootem)是一个相对单位,类似于em,em是父元素字体大小。不同的是rem的基准是相对于html元素的字体大小。比如,根元素(html)设置font-size=12px;非根元素设置width:2rem;则换成px表示就是24px。rem的优势:父元素文字大小可能不一致,但是整个页面只有一个html,......
  • 最新支持ChatGPT3.5/GPT4.0网站源码,AI系统源码,ChatGPT运营网站系统,支持GPTs应用、AI绘
    一、文章前言SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型+国内AI全模型。支持GPT-4o大模型、文档分析、识图图片理解、GPTs应用、GPT语音对话、联网提问、GPT-4全模型、DALL-E3文生图、GPT4-All联网搜索模型、思维导图、......
  • 关于FPGA对 DDR4 (MT40A256M16)的读写控制 I
    关于FPGA对DDR4(MT40A256M16)的读写控制I语言:VerilgHDLEDA工具:ISE、Vivado关于FPGA对DDR4(MT40A256M16)的读写控制I一、引言二、DDR4的特性(MT40A256M16)(1)电压和电源管理(2)内部参考电压生成(3)命令/地址延迟(CAL)(4)写入均衡(WriteLeveling)(5)自刷新模式(SelfRef......
  • 跟着杨中科学习(六)EFCore(四)
    自引用的组织结构树classOrgUnit{publiclongId{get;set;}publiclong?ParentId{get;set;}publicstringName{get;set;}publicOrgUnit?Parent{get;set;}publicList<OrgUnit>Children{get;set;}=newList<OrgUnit&g......
  • AiP74LVC1T45GB236.TR SOT23-6缓冲器/驱动器双电源接口电平转换
    AIP74LVC1T45GB236.TR是一款电平转换芯片,它的应用领域非常广泛,主要包括: 1.嵌入式系统:在嵌入式系统中,由于不同的外设可能工作在不同的电源电压下,该电平转换器可用于确保微控制器和其他逻辑电路之间的信号传输正确无误。 2.汽车电子:汽车电子系统经常需要处理来自不同电源......
  • pythontest4
    fromcollectionsimportOrderedDictdeflru_simulation(num_blocks,page_sequence):#初始化LRU缓存cache=OrderedDict()#缺页计数器page_faults=0#遍历访问页面序列forpageinpage_sequence:#检查页面是否已在缓存中ifp......