代码反向生成数据库注释更新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 ...
随机推荐
- 关于新版vue-cli安装json-server在build文件里没生成出dev-server文件
今天在安装json-server时遇到一个问题,build文件里并没有生成dev-server.js文件, 开始是怀疑配置有问题,或者安装不正确,然后重新安装了两三次,还是这样,郁闷.. 通过查询资料 ...
- final关键字在JVM中的理解
我们先来看两段代码与运行结果,根据结果去分析解释一下 不加final关键字: package com.waibizi; public class demo02 { public static void ...
- sublime修改快捷键样式
样式----------------{ "always_show_minimap_viewport": true, "auto_find_in_selection&quo ...
- mnist手写数字问题初体验
上一篇我们提到了回归问题中的梯度下降算法,而且我们知道线性模型只能解决简单的线性回归问题,对于高维图片,线性模型不能完成这样复杂的分类任务.那么是不是线性模型在离散值预测或图像分类问题中就没有用武之地 ...
- IDEA如何快速搭建Java开发环境
作为IntelliJ IDEA mac新手,IDEA如何快速搭建Java开发环境呢?今天小编就给大家带来了IntelliJ IDEA mac使用教程,想知道IDEA如何快速搭建Java开发环境? 全局 ...
- jquery form表单赋值封装
;!(function ($) { $.fn.setFormValue = function (options) { var $this = $(this); $.each(options, func ...
- 为什么MYSQL分页时使用limit+ order by会出现数据重复问题
问题描述: MYSQL采用limit进行翻页查询时,搭配order by ,在翻到第二页的时候可能会出现第一页的数据, 示例sql如下: select a,b from c where d = ' ...
- Firefox下载.net服务器文件时中文乱码
ASP.NET中产生一个Excel报表,供浏览器下载.显然,下载时经常有汉字报表名称.针对当前的两个主流的浏览器IE和Firefox,似乎没有兼容的解决办法.网上搜索了一些解决方法,但在Firefox ...
- [CF1034B] Longest Palindrome - 贪心
如果自己是回文串可以做中心 如果一个串和另一个串的转置相等则可以凑一对 优先配对 #include <bits/stdc++.h> using namespace std; int n,m ...
- DataGridView 定位到指定行
//定位到指定行(样式)dataGridView1.ClearSelection();dataGridView1.Rows[selectIndex].Selected = true; //让指定行处于 ...