代码反向生成数据库注释更新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 ...
随机推荐
- 《The good doctor》视频笔记
第一季 第一弹可以看 角色 肖恩莫非 梅伦德斯 克莱尔·布朗 贾里德·卡鲁 道格拉斯院长 卡莉 青木 一个很厉害的女实习医生,忘记名字了 病理知识 自闭症:由于神经系统失调导致的发育障碍,其病征包括不 ...
- sqlserver中判断是数字(会自动将.3识别为0.3)
SQL Server 检测是不是数字型的数据(两种方法) 检测是不是数字型的数据, 两种方法 1. ISNUMERIC ( expression ) 2. PATINDEX ( '%pattern%' ...
- 1315E Double Elimination DP 01枚举状态和倍增思想
E. Double Elimination DP 01枚举状态和倍增思想 题意 参考DOTA2双败赛制,一共有\(2^n\)个队打n轮 其中你有k喜欢的队伍,由你掌控比赛的输赢请问比赛中包含你喜欢的队 ...
- ALSA Lib-简单的播放例子
参考:https://www.alsa-project.org/alsa-doc/alsa-lib/_2test_2pcm_8c-example.html #include <stdio.h&g ...
- VS常用快捷键(最全)
智能提示:ctrl + J方法参数提示:ctrl + shift +空格智能标记(如:提示using.实现接口.抽象类等):ctrl + . 执行测试:ctrl + R,T(当前上下文),ctrl + ...
- window - 安装 tomcat
一.下载安装包 参考网址:https://archive.apache.org/dist/tomcat 百度网盘:https://pan.baidu.com/s/1mtNuTUCFp-_SIHIp_R ...
- C#的结构和数组
下面我们继续学习C#的语法.结构struct,C#中的结构和我们PLC中建立的UDT(结构体)是一样的.里面存储了相关的不同类型的数据. 有一句话我觉得十分重要:方法是依存于结构和对象存在的.这以后我 ...
- babel plugin
a = () => {}, // Support for the experimental syntax 'classProperties' isn't currently enabled ya ...
- 在VMware下安装CentOS 7.6
转载自https://blog.51cto.com/hnyuanzijian/2343716?appinstall=0a.点击左上角文件,新建虚拟机,选择典型安装,并下一步 b.选择稍后安装操作系 ...
- [SDOI2012] Longge的问题 - 欧拉函数
求 \(\sum\limits_{i=1}^{n}gcd(i,n)\) Solution 化简为 \(\sum\limits_{i|n}^{n}φ(\dfrac{n}{i})i\) 筛出欧拉函数暴力求 ...