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

最近用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中就行了。方便快捷。

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

时间: 2024-12-11 14:31:05

MySql生成.Net中Model类的存储过程的相关文章

sql 生成(c#model类)代码的存储过程

GO /****** 对象: StoredProcedure [dbo].[pro_GenerateModel] 脚本日期: 08/04/2012 11:26:43 ******/ IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[pro_GenerateModel]') AND type in (N'P', N'PC')) DROP PROCEDURE [dbo].[pro_GenerateMod

.Net初使用MySql数据库生成Model类并与SqlServer简单对比

最近的一个项目,在.net中使用MySql数据库,背景是这样的:Sql Server要购买授权,每年100多万,本来公司这么大,这点钱也不算什么,但是领导说能省就省.对于技术人员来说,这是个挑战,时间紧,技术上还有未知的风险.想想从实习到现在,四年多的.Net研发了,都是用的Sql Server数据库,这个Mysql还是头一回用-- 一.根据数据库生成EF的Model类 //表字段信息model public class TableSchemaModel { /// <summary> ///

myeclipse 链接mysql 生成pojo类

问题描述 myeclipse 链接mysql 生成pojo类 myeclipse已链接数据库,可看到数据库中的表以及修改数据,但生成pojo类时出现如下错误 An internal error occurred during: "Generating Artifacts". Getting database metadata 2015-05-20 17:31:25,743 WARN Worker-34 org.hibernate.cfg.SettingsFactory - Could

mysql-Java Web连接MySql数据库,修改数据库连接类中的用户名和密码没有效果?

问题描述 Java Web连接MySql数据库,修改数据库连接类中的用户名和密码没有效果? 现在在做一个项目,其中编写了数据库连接及操作的类. 1.ConnDB类. package com.wgh.tools; import java.io.InputStream; //导入java.io.InputStream类 import java.sql.*; //导入java.sql包中的所有类 import java.util.Properties; //导入java.util.Properties

mvc中动态给一个Model类的属性设置验证

原文:mvc中动态给一个Model类的属性设置验证 在mvc中有自带的验证机制,比如如果某个字段的类型是数字或者日期,那么用户在输入汉字或者英文字符时,那么编译器会自动验证并提示用户格式不正确,不过这样的验证毕竟功能有限,那么就需要我们自己进行定制验证. 假设有Model类:class Dinners{ private string Title;      private System.DateTime EventDate;      private string Description;   

使用Mybatis-Generator自动生成Dao、Model、Mapping相关文件(转)

出处:http://www.cnblogs.com/lichenwei/p/4145696.html Mybatis属于半自动ORM,在使用这个框架中,工作量最大的就是书写Mapping的映射文件,由于手动书写很容易出错,我们可以利用Mybatis-Generator来帮我们自动生成文件.   1.相关文件 关于Mybatis-Generator的下载可以到这个地址:https://github.com/mybatis/generator/releases 由于我使用的是Mysql数据库,这里需

Mybatis 自动生成代码工具 ---- 却没有生成DAO具体实现类

问题描述 我的配置:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd&quo

iOS开发之遍历Model类的属性并完善使用Runtime给Model类赋值

在上篇博客<iOS开发之使用Runtime给Model类赋值>中介绍了如何使用运行时在实体类的基类中添加给实体类的属性赋值的方法,这个方法的前提是字典的Key必须和实体类的Property Name相同,然后通过运行时来生成和执行Setter方法给Model类的属性赋值. 通过Runtime来给Model类属性赋值的好处是多多的,它便于代码的后期维护,并且提高了开发效率.当你拿到解析后的字典时你不用一个一个的通过key去把字典的值赋值给相应的Model类的属性,本篇博客中会给出如何去遍历Mod

SQL 中常见的系统存储过程

原文:SQL 中常见的系统存储过程 -- 来源于网络 -- 更详细的介结参考联机帮助文档  xp_cmdshell --*执行DOS各种命令,结果以文本行返回.  xp_fixeddrives --*查询各磁盘/分区可用空间  xp_loginconfig --*报告SQL Server 实例在Windows 上运行时的登录安全配置  xp_logininfo --*返回有关Windows 认证登录的信息.  xp_msver --*返回有关Microsoft SQL Server 的版本信息