MySql生成.Net中Model类的存储过程

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: 最近用Mysql,花时间写了一个过程用来生成EF的model类,有注释,挺方便,用EF类Entity自动生成的没有字段注释。要用到的函数:DELIMITER $$DROP FUNCTION IF EXISTS `fun_GetCSTypeF...

最近用Mysql,花时间写了一个过程用来生成EF的model类,有注释,挺方便,用EF类Entity自动生成的没有字段注释。


要用到的函数:

DELIMITER $$
DROP FUNCTION IF EXISTS `fun_GetCSTypeFromDbType`$$
CREATE FUNCTION `fun_GetCSTypeFromDbType`(#本函数不需要在线上执行
dbtype VARCHAR(50)
)
    RETURNS VARCHAR(50)
    
    BEGIN
	DECLARE 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:pukuimin
tableSchema VARCHAR(50),-- 用到的数据库
tableName VARCHAR(50) #要生成的类名
)

BEGIN
DECLARE 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));
ELSE
	SET 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));
  -- 打开游标2
OPEN 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;
    -- 关闭游标2
CLOSE 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中就行了。方便快捷。


不同的项目,可能要根据不同的类名、命名空间等等把固定的部分修改一下,其他的都一样,就是字段、类型和注释的生成。





相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
存储 关系型数据库 MySQL
MySql创建带事务操作的存储过程
MySql创建带事务操作的存储过程
|
26天前
|
存储 SQL 关系型数据库
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】(2)
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】
|
26天前
|
存储 SQL 关系型数据库
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】(1)
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】
|
19天前
|
存储 SQL 关系型数据库
MySQL数据库进阶第四篇(视图/存储过程/触发器)
MySQL数据库进阶第四篇(视图/存储过程/触发器)
|
25天前
|
存储 SQL 关系型数据库
MySQL存储过程和存储函数的使用
MySQL的存储过程和存储函数在功能和用法上有明显的区别。存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,通过指定名称和参数(如果有)来调用执行,可以返回多个值或结果集,但不直接返回值。而存储函数则是一个有返回值的特殊存储过程,它返回一个值或表对象,可以直接嵌入SQL语句中使用,如SELECT语句中。两者都是为了提高SQL代码的重用性和性能,但使用场景和方式有所不同。
157 4
|
23天前
|
存储 关系型数据库 MySQL
MySQL周内训参照5、存储过程创建
MySQL周内训参照5、存储过程创建
29 1
|
24天前
|
存储 关系型数据库 MySQL
MYSQL--存储过程操作
MYSQL--存储过程操作
|
26天前
|
存储 SQL 关系型数据库
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】(3)
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】
|
10天前
|
存储 关系型数据库 分布式数据库
PolarDB产品使用问题之在将RDS迁移到PolarDB后,原先由root用户创建的视图、存储过程等是否可以继续使用的
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
1月前
|
存储 关系型数据库 MySQL
MySQL数据库——存储过程-条件处理程序(通过SQLSTATE指定具体的状态码,通过SQLSTATE的代码简写方式 NOT FOUND)
MySQL数据库——存储过程-条件处理程序(通过SQLSTATE指定具体的状态码,通过SQLSTATE的代码简写方式 NOT FOUND)
15 0
MySQL数据库——存储过程-条件处理程序(通过SQLSTATE指定具体的状态码,通过SQLSTATE的代码简写方式 NOT FOUND)