Abp框架,EF 生成迁移文件时,自动添加表和字段注释内容

news2024/10/6 5:13:25

在使用 abp 框架,或者ef 的时候都会遇到一个问题,就是建实体后要将实体描述生成到数据库中,就需要手动去添加

[Comment("注释内容")]

注解,这样相当于手动写两次注释(即使你是 Ctrl + C),这样不免有些麻烦,何况还会有遗漏的时候;

经过在网上的搜索:

Ef Core花里胡哨系列(6) XML注释同步到数据库注释-CSDN博客

通过 该作者 提供的代码,做了如下修改:

在项目的 xxx.xxx.EntityFrameworkCore 层下,重写 "xxxDbContext" 类中的  OnModelCreating 方法,代码如下:

/// <summary>
/// 重写为模型创建时附带注释内容
/// </summary>
/// <param name="modelBuilder"></param>
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    try
    {
        foreach (var entityType in modelBuilder.Model.GetEntityTypes())
        {
            var typeComment = GetDescription(entityType.ClrType.FullName, "");

            // 存在注释才去生成
            if (!typeComment.IsNullOrWhiteSpace())
                // modelBuilder.Entity(entityType.ClrType).ToTable(t => t.HasComment(typeComment));
                modelBuilder.Entity(entityType.ClrType).HasComment(typeComment);

            foreach (var property in entityType.ClrType.GetProperties().Where(x => x.IsPublic() && x.CanWrite && x.CanRead))
            {
                // 判断是否为值类型,string 除外
                if (!property.PropertyType.IsValueType && typeof(string) != property.PropertyType)
                    continue;

                // (这里是个人对类型的熟悉和练手)
                //if (!property.PropertyType.IsValueType)
                //{

                //    // 对类型进行判断,提出来写美观 ,过滤导航属性 IEntity
                //    if (property.PropertyType.IsGenericType || property.GetSetMethod().IsVirtual)
                //        continue;

                //    // bus_Problem
                //    if (property.PropertyType.GetInterfaces().Any(p => p.IsGenericType && typeof(IEntity<>) == p.GetGenericTypeDefinition()))
                //        continue;
                //}

                var propertyComment = GetDescription(entityType.ClrType.FullName, property.Name);

                // 存在注释才去生成
                if (!propertyComment.IsNullOrEmpty())
                {
                    modelBuilder.Entity(entityType.ClrType).Property(property.Name).HasComment(propertyComment);
                }
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
        throw;
    }

    base.OnModelCreating(modelBuilder);
}

/// <summary>
/// 获取 xml 描述
/// </summary>
/// <param name="xmlFullName">完整的类型名称</param>
/// <param name="columnName">字段名称</param>
/// <returns></returns>
private string GetDescription(string xmlFullName = "", string columnName = "")
{

    // 领域层 xml文件名称地址,记得项目输出 xml 文件哦!!
    string path = Path.Combine(AppContext.BaseDirectory, "xxx.xxx.Core.xml");

    // 加载xml
    XmlDocument xml = new XmlDocument();
    xml.Load(path);

    // 查询节点
    XmlNode classNode = xml.SelectSingleNode($"//member[@name='T:{xmlFullName}']");

    if (classNode == null)
    {
        return string.Empty;
    }

    if (columnName.IsNullOrEmpty())
    {
        return classNode.InnerText.Replace("\n", "").Replace("\r", "").Trim();
    }
    else
    {
        var propertyNode = xml.SelectSingleNode(($"//member[@name='P:{xmlFullName}.{columnName}']"));
        if (propertyNode == null)
        {
            return string.Empty;
        }
       
        return propertyNode.InnerText.Replace("\n", "").Replace("\r", "").Trim();
    }
}

最终运行 命令

Add-Migration init

生成出的迁移文件就会包含注释;

这里也在网上找到一个不错的 sql文档生成工具,附带链接一下给大家,好东西免得沉没了。

SmartSQL: 🔥🔥🔥 一款方便、快捷的数据库文档查询、生成工具,支持SqlServer/Oracle/MySql/PostgreSQL/SQLite数据库表结构文档查询、生成;导出文档支持CHM、Word、Excel、PDF、Html、Xml、Json、MarkDown等多种格式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1672354.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

现在做电商迟吗?那是你不知道今年黑马,视频号小店重磅来袭

大家好&#xff0c;我是电商笨笨熊 24年想做电商&#xff0c;还能不能做&#xff1f; 当然可以。 电商是一个长期的市场&#xff0c;只要用户有需求&#xff0c;那么电商就会一直存在&#xff1b; 尤其是近几年来无货源模式爆火&#xff0c;对于我们商家来说这种无需自备货…

软件安全测试可以检测软件哪些安全问题?

软件安全测试是一种旨在发现和评估软件应用程序中的安全漏洞和隐患的测试方法。通过安全测试&#xff0c;可以发现并修复潜在的安全问题&#xff0c;从而提高软件应用程序的可靠性和安全性。下面将介绍软件安全测试可以检测到的几种主要安全问题。 身份验证漏洞&#xff1a;身份…

【教学类-55-02】20240512图层顺序挑战(四格长条纸加黑色边框、4*4、7张 、43200张去掉非7色有23040张,去掉重复样式有几种?)

作品展示 背景需求&#xff1a; 之前的代码吗存在几个问题&#xff0c;最大的问题是不能生成“”长条黑边框”” 【教学类-55-01】20240511图层顺序挑战&#xff08;四格长条纸&#xff09;&#xff08;4*4&#xff09;和“手工纸自制参考图”-CSDN博客文章浏览阅读485次&…

黑盒测试中的边界值分析

黑盒测试是一种基于需求和规格的测试方法&#xff0c;它主要关注软件系统输出的正确性和完整性&#xff0c;而不考虑内部代码的实现方式。在黑盒测试中&#xff0c;边界值分析是一种重要的测试技术&#xff0c;它可以帮助测试人员有效地发现输入和输出的问题。本文将从什么是边…

nacos在没有指定数据源的情况下默认使用什么数据库?

在没有特别指定数据源的情况下&#xff0c;Nacos 默认使用内嵌的数据库 Derby 来存储其数据。Derby 是一个轻量级的、基于 Java 的数据库管理系统&#xff0c;适合于开发和测试环境&#xff0c;因为它简单易部署且无需额外的数据库服务器。然而&#xff0c;对于生产环境&#x…

JSP ssm 房屋中介管理myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 JSP ssm 房屋中介管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采…

【C语言/数据结构】栈:从概念到两种存储结构的实现

目录 一、栈的概念 二、栈的两种实现方式 1.顺序表实现栈 2.链表实现栈 三、栈的顺序存储结构及其实现 1.栈的声明 2.栈的初始化 3.栈的销毁 4.栈的压栈 5.栈的弹栈 6.栈的判空 7.返回栈顶元素 8.返回栈的长度 四、栈的链式存储结构及其实现 1.栈的声明 2.栈的…

GBase 8s 数据库集群切换及恢复

GBase 8s 数据库切换分为自动切换、由CM控制的按FOC规则的切换、手工切换。 自动切换 全自动切换用于HAC集群中&#xff0c;由于集群只有两个节点&#xff0c;数据库相互之前进行状态检查&#xff0c;发现异常时&#xff0c;能按DRAUTO的配置方式进行自动切换。 在HAC集群中&…

ES扩缩容

ES扩容 1.1 页面扩容ES1 1.2 拷贝插件及ssl文件 JSON [ec_admin@kde-offline3 ~]$ sudo rsync -avP /usr/kde_ec/2.3.6.6-1/elasticsearch1/plugins/* kde-offline6:/usr/kde_ec/2.3.6.6-1/elasticsearch1/plugins/ ;echo $? [ec_admin@kde-offline3 ~]$ sudo rsync -avP /us…

SQL Server中怎么排查死锁问题

一、背景 我们在UAT环境压测的时候&#xff0c;遇到了如下的死锁异常。 Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Transaction (Process ID 82) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Re…

Windows下安装Node.js、npm和electronic,并运行一个Hello, World!脚本程序

20240510 By wdhuag 目录 简介&#xff1a; 参考&#xff1a; 安装Node.js 安装npm 配置npm&#xff1a; 修改包存放目录和缓存目录 切换镜像源 使用 nrm 切换镜像源 安装Electron 运行一个Hello, World!脚本程序 安装Yarn JavaScript 指南 简介&#xff1a; Nod…

【Spring】GoF 之代理模式

一、代理模式 在 Java 程序中的代理模式的作用&#xff1a; 当一个对象需要受到保护的时候&#xff0c;可以考虑使用代理对象去完成某个行为 需要给某个对象的功能进行功能增强的时候&#xff0c;可以考虑找一个代理进行增强 A 对象无法和 B 对象直接交互时&#xff0c;也可以…

MySQL5.7压缩包安装图文教程

一、下载 https://dev.mysql.com/downloads/mysql/ 选择5.7版本 二、解压 下载完成后解压&#xff0c;解压后如下&#xff08;zip是免安装的&#xff0c;解压后配置成功即可使用&#xff09; 注意&#xff1a;只有5.6以前的版本才有在线安装&#xff08;install msi&#xf…

徐孝雅:一位清华毕业温州人的科技报国之路

图 徐孝雅 偶然的一次聚会,朋友讲述一位科技企业家的传奇故事,出于记者的敏感,我对这位企业家产生了好奇。 2024年4月,我们如约见到这位企业家,他叫徐孝雅。他给我的印象极其深刻,中等身材,儒雅大方,气度不凡,眼神展露坚定和自信,浑身散发神采和活力。寒暄之后,似乎一见如故…

armbian 安装libreoffice 转换word为PDF

安装libreoffice sudo apt-get install libreoffice安装JVM sudo apt-get install default-jre #验证 java -version尝试转换&#xff1a; libreoffice --convert-to pdf /root/printFiles/f.docx发现问题乱码 从Windows 拷贝字体到debian上&#xff0c;windows字体路径是&a…

第十二讲:指针(4)

第十二讲&#xff1a;指针&#xff08;4&#xff09; 1.回调函数1.1什么是回调函数1.2深入理解并使用回调函数1.2.1简单写法1.2.2优化 2.qsort函数详解2.1函数简单介绍2.3qsort函数使用举例2.3.1qsort函数排序整形数据2.3.2qsort函数排序结构数据 3.qsort函数的模拟实现3.1冒泡…

网络实验新境界,PNETLab模拟器部署指南

在网络工程领域&#xff0c;拥有一个可靠的网络实验平台至关重要。PNETLab模拟器是一款功能强大的网络仿真工具&#xff0c;它支持包括华为、华三、锐捷、思科在内的多种设备&#xff0c;并且以开源免费的形式提供&#xff0c;这使得它在业界备受青睐。 软件介绍 PNETLab&am…

ThingsBoard版本控制配合Gitee实现版本控制

1、概述 2、架构 3、导出设置 4、仓库 5、同步策略 6、扩展 7、案例 7.1、首先需要在Giitee上创建对应同步到仓库地址 ​7.2、giit仓库只能在租户层面进行配置 7.3、 配置完成后&#xff1a;检查访问权限。显示已成功验证仓库访问&#xff01;表示配置成功 7.4、添加设…

【代码随想录】【动态规划】背包问题 - 完全背包

完全背包 模板&#xff1a;完全背包问题 问题描述 完全背包问题与01背包问题唯一的区别在于&#xff1a; 在01背包中&#xff1a;每个物品只有一个&#xff0c;要么放入背包&#xff0c;要么不放入背包在完全背包中&#xff1a;每个物品有无限多个&#xff0c;可以不放入背…

使用Eigen将经纬度、高程、偏北角转成变换矩阵

目录 1、前言 2、示例 3、代码解析 4、垂直于给定点的切平面变换 5、代码解析 1、前言 在地球表面进行刚体变换时候&#xff0c;要将具有经纬度、高程和偏北角的坐标信息转换为变换矩阵表达&#xff0c;首先需要了解坐标系之间的转换关系。 通常&#xff0c;我们会将经纬…