在使用 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");// 加载xmlXmlDocument 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等多种格式。