原理

通过反射实体所在程序集,得到枚举值列表,再通过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的更多相关文章

  1. 用PowerDesign反向生成数据库Sql语句问题

            在用Pd15反向生成数据库时,生成的Sql语句在Sql Server Manager Studio里面报错,根本就执行不了.数据库用的是Sql Server 2008 R2.经过一番修 ...

  2. mybatise插件反向生成数据库表相关Java代码

    1.下载相关jar包https://github.com/mybatis/generator/releases 2.配置xml文件 <?xml version="1.0" e ...

  3. Navicat生成数据库结构同步SQL

    作为一个苦逼的技术男,在做开发的时候经常会遇见程序版本升级,数据库结构变化.我们需要一个快捷的方式让客户尽快从旧版本数据库结构更新至新版本数据库结构.如果每做一次改动我们就记录一下当然是好事,但是万一 ...

  4. VS2010 根据模型生成数据库 打开edmx.sql文件时 vs出现无响应的解决方案

    今天在VS2010 sp1+sql server 2008 R2+Win7操作系统下测试ADO.NET 实体数据模型时 ,遇到这样一个问题. 首先建好实体模型,然后"根据模型生成数据库&qu ...

  5. 使用PowerDesign15反向生成数据库

           在Pd15中建立物理模型后,可以通过反向工程直接生成数据库的表结构.主要有以下几个步骤: 1. 首先设置一下数据库配置,选择对应要使用的数据库(此处选择Sql Server 2008 R ...

  6. EntityFramework Code First 手写代码实现生成数据库

    第一步:写实体类 第二步:写一个实体操作类,此类必须继承Dbcontext,此处的属性,将会在初始化时(第一次作,增,删,改的时候),生成相应的表. 第三步:运行程序,会自动建表 注意: 若实体类发生 ...

  7. 一个自动生成插入与更新SQL语句的小类

    无需关注字段类型,只要传入字段名与值的集合,自动生成Ms sql server SQL语句.详见Test()方法 using System; namespace Fan.iData.SqlUtilit ...

  8. 使用VISIO远程服务器上的ORACLE数据库,反向生成数据库实体关系图

    反向即根据已有的数据库,生成ER图,很多工具都可以实现这一过程,如visio,powerdesigner等,下面文章记录一下我使用VISIO生成远程服务器上的一个数据库ER图过程,供以后自己参考. 1 ...

  9. MyEclipse下安装MyBatis Generator代码反向生成工具

    一.离线方式: 在http://mybatis.googlecode.com/svn/sub-projects/generator/trunk/eclipse/UpdateSite/下载 featur ...

随机推荐

  1. SpringBoot2.x-笔记(01)

    程序入口 @SpringBootApplication public class SpringbootApplication { public static void main(String[] ar ...

  2. win10子系统ubuntu忘记密码解决方案

    准备部署一个rocket.chat 需要安装mongodb 3.6  准备直接在子系统中安装一下,结果忘记ROOT密码了 找了一下子系统重置密码  记录如下 ubuntu config --defau ...

  3. VMware、Linux(CentOS 7)安装,供参考。

    前端开发,学习Linux,记录安装中的一些问题,比如在安装最小版后,如何由命令行转为图形界面等. -------------笔记中截图参考其他资料. 下载文件 VMware 12: 链接:https: ...

  4. Django---Django返回HTML文件

    前面我们简单的了解Django的一些工作原理,其中关于页面展示的内容,也全部都是视图(Views)返回的内容,那么我们也知道前端包括很多内容.如:HTML,CSS,JavaScript等以及各种插件, ...

  5. P2048 [NOI2010]超级钢琴 [堆+st表]

    考虑只能取长度为 [L,R] 的,然后不难想到用堆搞. 搞个前缀和的st表,里面维护的是一个 最大值的位置 struct rmq { int mx[N][20] ; void qwq(int n) { ...

  6. Java架构师资料

    Java架构师ZHONGVIP课程资料链接   2017年第一学期的资料链接:(视频和文档是一起的) 一.互联网工程专题         链接:https://pan.baidu.com/s/1PGE ...

  7. python3练习100题——040

    原题链接:http://www.runoob.com/python/python-exercise-example40.html 题目:将一个数组逆序输出. a=[1,2,3,4,5] print a ...

  8. Codeforces 1303E. Erase Subsequences 代码(dp 字符串压缩一维状态优化)

    https://codeforces.com/contest/1303/problem/E #include<bits/stdc++.h> using namespace std; ; i ...

  9. NetCore使用使用Scaffold-DbContext命令生成数据库表实体类

    一.为了模拟项目,本处创建了一个NetCore的Web项目.打算在Models文件夹下生成数据库表的实体类. 二.在程序包管理控制台,输入“Scaffold-DbContext "Serve ...

  10. 51 nod 1212 无向图最小生成树

    http://www.51nod.com/Challenge/Problem.html#problemId=1212 代码 #include<bits/stdc++.h> using na ...