代码反向生成数据库注释更新sql
原理
通过反射实体所在程序集,得到枚举值列表,再通过sql获取数据库表结构,两者拼接成sql。
规范
实体枚举字段最好也加上Description特性,方便多次更新;
代码
实体定义
public partial class ProviderContract : Entity<int>
{
/// <summary>
/// 自增Id
/// </summary>
[Column("Id")]
public override int Id { get; set; }
/// <summary>
/// 供应商ID
/// </summary>
public int ProviderId { get; set; }
/// <summary>
/// 合同编号
/// </summary>
public string ContractNo { get; set; }
/// <summary>
/// 主营类目
/// </summary>
public ContractGoodsType GoodsType { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime CreatedTime { get; set; }
/// <summary>
/// 修改时间
/// </summary>
public DateTime? ModifiedTime { get; set; }
}
枚举定义
当读取不到枚举值的Description特性时,采用字段名称代替;
public enum ContractGoodsType
{
None = 0,
/// <summary>
/// 酒店
/// </summary>
Hotel = 1,
/// <summary>
/// 门票
/// </summary>
Ticket = 2,
/// <summary>
/// 市区娱乐
/// </summary>
UrbanEntertainment = 3,
/// <summary>
/// 实物
/// </summary>
MaterialObject = 7,
}
测试代码
public void Test()
{
var exceptTypeNames = new string[] { "AppId", "ApplicationId" };
var allEnumTypes = Assembly.Load("Core").GetTypes()
.Where(t => t.Namespace == "Core.Entities")
.SelectMany(r => r.GetProperties()
.Where(p => p.PropertyType.IsEnum && !p.CustomAttributes.Any() && !exceptTypeNames.Contains(p.Name)))
.Select(p => new
{
TableName = p.ReflectedType.Name,
ColumnName = p.Name,
EnumType = p.PropertyType
}).OrderBy(r => r.ColumnName).ToList();
List<TableDeclare> list;
using (var dapper = new DapperHelper())
{
var sql = @"select table_name, column_name, column_comment, column_type, column_default, is_nullable from information_schema.columns
where table_schema='test'";
list = dapper.Query<TableDeclare>(sql).ToList();
}
foreach (var item in allEnumTypes)
{
var enumDtos = item.EnumType.GetFields().Skip(1).Select(e => new
{
EnumValue = (int)e.GetValue(null),
EnumName = e.Name,
EnumDescAttr = e.GetCustomAttributes()
.Where(ac => ac.GetType() == typeof(DescriptionAttribute)).FirstOrDefault()
as DescriptionAttribute,
}).ToList();
var remark = string.Join(',',
enumDtos.Select(e => e.EnumValue + ":" + (e.EnumDescAttr == null ? e.EnumName : e.EnumDescAttr?.Description)));
var column = list.Where(l => l.table_name == item.TableName.ToLower() && l.column_name == item.ColumnName).FirstOrDefault();
//过滤原注释包含数字
if (column != null && !column.column_comment.Any(c => int.TryParse(c.ToString(), out int _)))
{
var nullable = column.is_nullable == "YES" ? " null " : string.Empty;
var defalutValue = column.column_default == null ? string.Empty : " default " + column.column_default + " ";
Debug.WriteLine($"ALTER TABLE `{column.table_name}` MODIFY COLUMN `{column.column_name}` {column.column_type}{nullable}{defalutValue} COMMENT '{column.column_comment}({remark})';");
}
}
}
private class TableDeclare
{
public string table_name { get; set; }
public string column_name { get; set; }
public string column_comment { get; set; }
public string column_type { get; set; }
public string column_default { get; set; }
public string is_nullable { get; set; }
}
生成的sql效果
ALTER TABLE `providercontract` MODIFY COLUMN `GoodsType` int(11) null default 0 COMMENT '主营类目(0:None,1:Hotel,2:Ticket,3:UrbanEntertainment,7:MaterialObject)'
代码反向生成数据库注释更新sql的更多相关文章
- 用PowerDesign反向生成数据库Sql语句问题
在用Pd15反向生成数据库时,生成的Sql语句在Sql Server Manager Studio里面报错,根本就执行不了.数据库用的是Sql Server 2008 R2.经过一番修 ...
- mybatise插件反向生成数据库表相关Java代码
1.下载相关jar包https://github.com/mybatis/generator/releases 2.配置xml文件 <?xml version="1.0" e ...
- Navicat生成数据库结构同步SQL
作为一个苦逼的技术男,在做开发的时候经常会遇见程序版本升级,数据库结构变化.我们需要一个快捷的方式让客户尽快从旧版本数据库结构更新至新版本数据库结构.如果每做一次改动我们就记录一下当然是好事,但是万一 ...
- VS2010 根据模型生成数据库 打开edmx.sql文件时 vs出现无响应的解决方案
今天在VS2010 sp1+sql server 2008 R2+Win7操作系统下测试ADO.NET 实体数据模型时 ,遇到这样一个问题. 首先建好实体模型,然后"根据模型生成数据库&qu ...
- 使用PowerDesign15反向生成数据库
在Pd15中建立物理模型后,可以通过反向工程直接生成数据库的表结构.主要有以下几个步骤: 1. 首先设置一下数据库配置,选择对应要使用的数据库(此处选择Sql Server 2008 R ...
- EntityFramework Code First 手写代码实现生成数据库
第一步:写实体类 第二步:写一个实体操作类,此类必须继承Dbcontext,此处的属性,将会在初始化时(第一次作,增,删,改的时候),生成相应的表. 第三步:运行程序,会自动建表 注意: 若实体类发生 ...
- 一个自动生成插入与更新SQL语句的小类
无需关注字段类型,只要传入字段名与值的集合,自动生成Ms sql server SQL语句.详见Test()方法 using System; namespace Fan.iData.SqlUtilit ...
- 使用VISIO远程服务器上的ORACLE数据库,反向生成数据库实体关系图
反向即根据已有的数据库,生成ER图,很多工具都可以实现这一过程,如visio,powerdesigner等,下面文章记录一下我使用VISIO生成远程服务器上的一个数据库ER图过程,供以后自己参考. 1 ...
- MyEclipse下安装MyBatis Generator代码反向生成工具
一.离线方式: 在http://mybatis.googlecode.com/svn/sub-projects/generator/trunk/eclipse/UpdateSite/下载 featur ...
随机推荐
- Linux 命令之 linux 四剑客
Linux命令-- 四剑客 一:Linux命令 之 AWK 符号:^ 开头 $ 结尾 awk 是一种处理文本的语言,一个强大的文本分析命令! 1:提取文件中的每行的第二个 提取前文本中内容为 命令: ...
- Java-出栈次序
题目: X星球特别讲究秩序,所有道路都是单行线.一个甲壳虫车队,共16辆车,按照编号先后发车,夹在其它车流中,缓缓前行.路边有个死胡同,只能容一辆车通过,是临时的检查站,如图所示. X星球太死板,要求 ...
- 如何通过 SSH/Telnet 用 root 权限登录群晖
出于系统安全原因,对 Synology NAS 的 root 访问有限.如果您获取 root 权限,请在命令行界面中用任何属于Local Administrators群组的帐户证书登录 DSM(如Pu ...
- JMeter-查找元素
参考文档:https://jmeter.apache.org/usermanual/hints_and_tips.html 有时很难使用变量或包含某个URL或参数的方法在“测试计划”树和元素中找到. ...
- open()和with open()的区别
open 1,打开文件 file=open("文件名",“读写模式”) 2,操作文件 *** 3,关闭文件 file.close() 注意事项: 使用open方法,文件操作完毕之后 ...
- BIM人才三角
BIM 人才三角聚焦六个关键技能和一个中心. 1. 基础能力 基础能力分三块: 语言能力 实践能力 数学能力 1.1 语言能力 语言是指自然语言,如汉语和英语.获取其他知识的能力以及学习.理解.沟通能 ...
- 了解SIT和UAT的基本内涵
SIT:System Integration Test(系统集成测试,即内部测试)根据用例描述测试每一个场景,优化系统性能,提交数据库性能excution plan给DBA review.对系统进行压 ...
- cf1282c
题意描述: 给你一颗带权无根树,共有2*n个节点,有n对人,然后每一个人被分配到一个节点上 问题1:怎么安排使得这n对人之间距离之和最小 问题2:怎么安排使得这n对人之间距离之和最大 题解:直接去想具 ...
- 常见sql注入的类型
这里只讲解sql注入漏洞的基本类型,代码分析将放在另外一篇帖子讲解 目录 最基础的注入-union注入攻击 Boolean注入攻击-布尔盲注 报错注入攻击 时间注入攻击-时间盲注 堆叠查询注入攻击 二 ...
- sqli-labs11-17(手注+sqlmap)
这几关涉及到的都是post型data处注入,和get型的差别就是注入点的测试处不一样,方法都是一样的 0x01 sqli-labs less-11 1.手工 由于是post型注入,那么我们不能在url ...