MySql生成.Net中Model类的存储过程
来源:互联网 发布:音频编辑软件哪个好 编辑:程序博客网 时间:2024/06/06 03:32
最近用Mysql,花时间写了一个过程用来生成EF的model类,有注释,挺方便,用EF类Entity自动生成的没有字段注释。
要用到的函数:
DELIMITER $$DROP FUNCTION IF EXISTS `fun_GetCSTypeFromDbType`$$CREATE FUNCTION `fun_GetCSTypeFromDbType`(#本函数不需要在线上执行dbtype VARCHAR(50)) RETURNS VARCHAR(50) BEGINDECLARE ret VARCHAR(50);IF dbtype='nvarchar' OR dbtype='varchar' OR dbtype='text' THEN SET ret='string';ELSEIF dbtype='datetime' OR dbtype='date' THEN SET ret='DateTime';ELSEIF dbtype='bit' THEN SET ret='bool';ELSEIF dbtype='bigint' THEN SET ret='long';ELSE SET ret=dbtype;END IF;RETURN ret; END$$DELIMITER ;/*select fun_GetCSTypeFromDbType('bit');*/
DELIMITER $$DROP PROCEDURE IF EXISTS `P_GenerateModel`$$CREATE PROCEDURE `P_GenerateModel`(##本存储过程不会在程序中调用,不需在线上执行,调用了函数 fun_GetCSTypeFromDbType 如果在其他库执行要注意,author:pukuimintableSchema VARCHAR(50),-- 用到的数据库tableName VARCHAR(50) #要生成的类名)BEGINDECLARE count1_1 INT;DECLARE retString VARCHAR(8000);DECLARE table_name1,column_Name1,is_nullable1,data_type1,character_maximum_length1,column_comment1,Column_Key1 VARCHAR(100);DECLARE REFERENCED_TABLE_NAME1,REFERENCED_COLUMN_NAME1 VARCHAR(100);DECLARE pri_Column_Name,pri_data_type VARCHAR(100);-- 需要定义接收游标数据的变量 -- 遍历数据结束标志DECLARE done INT DEFAULT 0;DECLARE cur CURSOR FOR SELECT table_name,column_Name,is_nullable,data_type,character_maximum_length,column_comment,Column_Key FROM information_schema.COLUMNS WHERE table_schema=tableSchema AND table_name = tableName;DECLARE cur2 CURSOR FOR SELECT table_name,column_name,REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE table_schema=tableSchema AND table_name = tableName;-- 将结束标志绑定到游标DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;SET retString = ''; #初始化为空串SET retString=CONCAT(retString,'namespace YCF.Stock.Core.Entities{ using Abp.Domain.Entities; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using YCF.Stock.Core.Enum;');SET retString=CONCAT(retString,' [Table("',tableName,'")]',CHAR(10));SELECT column_Name,data_type INTO pri_Column_Name, pri_data_type FROM information_schema.COLUMNS WHERE table_schema=tableSchema AND table_name = tableName AND Column_Key='PRI' LIMIT 1;SET retString=CONCAT(retString,' public partial class ',tableName,' : Entity<',fun_GetCSTypeFromDbType(pri_data_type),'>',CHAR(10));SET retString=CONCAT(retString,' {',CHAR(10));#set retString=CONCAT(retString,'// priName:',pri_Column_Name,',priType:',pri_data_type,char(10));-- 打开游标OPEN cur; -- 开始循环read_loop: LOOP -- 提取游标里的数据,这里只有一个,多个的话也一样; FETCH cur INTO table_name1,column_Name1,is_nullable1,data_type1,character_maximum_length1,column_comment1,Column_Key1; -- 声明结束的时候 IF done=1 THEN LEAVE read_loop; END IF; -- 这里做你想做的循环的事件 #set retString=CONCAT(retString,'',CHAR(10)); SET retString=CONCAT(retString,' /// <summary> /// ',column_comment1,' /// </summary>');IF data_type1='varchar' OR data_type1='varchar' THEN SET retString=CONCAT(retString,' [StringLength(',character_maximum_length1,')] [MaxLength(',character_maximum_length1,')]',CHAR(10));ELSEIF data_type1='date' OR data_type1='bit' THEN SET retString=CONCAT(retString,' [Column(TypeName = "',data_type1,'")]',CHAR(10));END IF;IF Column_Key1='PRI' THEN SET retString=CONCAT(retString,' [Column("',column_Name1,'")]',CHAR(10),' public override ',fun_GetCSTypeFromDbType(data_type1),' Id { get; set; }',CHAR(10));ELSESET retString=CONCAT(retString,' public ',fun_GetCSTypeFromDbType(data_type1),CASE WHEN is_nullable1 ='YES' THEN '?' ELSE '' END,' ',column_Name1,' { get; set; }',CHAR(10));END IF;END LOOP; -- 关闭游标CLOSE cur;SET done=0;#重新把done标识为0,开始第二个游标SET retString=CONCAT(retString,'/*',CHAR(10)); -- 打开游标2OPEN cur2;-- 开始循环 read_loop2: LOOP -- 提取游标里的数据,这里只有一个,多个的话也一样; FETCH cur2 INTO table_name1,column_Name1,REFERENCED_TABLE_NAME1,REFERENCED_COLUMN_NAME1; -- 声明结束的时候 IF done=1 THEN LEAVE read_loop2; END IF; -- 这里做你想做的循环的事件 #set retString=CONCAT(retString,'',CHAR(10)); IF REFERENCED_TABLE_NAME1 IS NOT NULL THEN SET retString=CONCAT(retString,' public virtual ',REFERENCED_TABLE_NAME1,' ',REFERENCED_TABLE_NAME1,' { get; set; }',CHAR(10)); END IF; END LOOP; -- 关闭游标2CLOSE cur2;SET retString=CONCAT(retString,'/*',CHAR(10)); SET retString=CONCAT(retString,'#warning 因数据库表名全部自动小写,请手动调整导航属性 public virtual XXX XXX { get; set; }',CHAR(10));SET retString=CONCAT(retString,' }}',CHAR(10));SELECT retString;END$$DELIMITER ;/*call P_GenerateModel('MyDB','ItemContractStock');*/
调用生成,复制到Model.cs中就行了。方便快捷。
不同的项目,可能要根据不同的类名、命名空间等等把固定的部分修改一下,其他的都一样,就是字段、类型和注释的生成。
0 0
- MySql生成.Net中Model类的存储过程
- sql 生成(c#model类)代码的存储过程
- mysql 生成UUID 存储过程的基本概念
- 【动软.Net代码生成器】连接MySQL生成C#的POCO实体类(Model)
- 数据库中存储过程的自动化生成
- 数据库中存储过程的自动化生成
- 数据库中存储过程的自动化生成
- 数据库中存储过程的自动化生成
- 生成订单存储过程(mysql)
- mysql存储过程,生成测试数据
- MySQL存储过程及java中存储过程的调用
- Asp.net中存储过程的使用
- .net 中存储过程的使用
- ASP.NET中常用的存储过程
- vb.net中存储过程的使用
- mysql中存储过程
- mysql 中存储过程
- mysql中存储过程
- 自己制作的播放器MeITo
- 命令行jarsigner签字和解决找不到证书链错误
- SLAM:数据集
- PHP框架开发教程(二) 文件分布
- 栈的数组实现与链表实现
- MySql生成.Net中Model类的存储过程
- android 打开文件的Intent及使用
- C++面试题 1-50
- 【Android基础知识】IntentService基本使用
- 控制台颜色设置
- HDU 1171 Big Event in HDU(01背包)
- Java基础知识IO流(拷贝文本文件)
- 整数哈希介绍
- 50-100