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

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 最近的一个项目,在.net中使用MySql数据库,背景是这样的:Sql Server要购买授权,每年100多万,本来公司这么大,这点钱也不算什么,但是领导说能省就省。

最近的一个项目,在.net中使用MySql数据库,背景是这样的:Sql Server要购买授权,每年100多万,本来公司这么大,这点钱也不算什么,但是领导说能省就省。对于技术人员来说,这是个挑战,时间紧,技术上还有未知的风险。想想从实习到现在,四年多的.Net研发了,都是用的Sql Server数据库,这个Mysql还是头一回用……


一、根据数据库生成EF的Model类

//表字段信息model

    public class TableSchemaModel
    {
        /// <summary>
        /// 表名
        /// </summary>
        public string TableName { get; set; }
        /// <summary>
        /// 字段名
        /// </summary>
        public string ColumnName { get; set; }
        /// <summary>
        /// 是否可空:可空-YES,不可空-NO
        /// </summary>
        public string IsNullable { get; set; }
        /// <summary>
        /// 字段数据类型
        /// </summary>
        public string DataType { get; set; }
        /// <summary>
        /// 字符串长度
        /// </summary>
        public int? CharacterMaximumLength { get; set; }
        /// <summary>
        /// 字段描述
        /// </summary>
        public string ColumnComment { get; set; }
        /// <summary>
        /// 键标识:主键-PRI,外键-MUL
        /// </summary>
        public string ColumnKey { get; set; }
    }

    public class TableRefrenceModel
    {
        /// <summary>
        /// 表名
        /// </summary>
        public string TableName { get; set; }
        /// <summary>
        /// 字段名
        /// </summary>
        public string ColumnName { get; set; }
        /// <summary>
        /// 关联的表名
        /// </summary>
        public string ReferencedTableName { get; set; }
        /// <summary>
        /// 关联的表字段名
        /// </summary>
        public string ReferencedColumnName { get; set; }
    }


//具体的处理方法,主要就是查询字段信息,循环生成Mode字段,就完了。

        /// <summary>
        /// 查询Mysql表字段信息
        /// </summary>
        /// <param name="tableName">表名</param>
        /// <returns></returns>
        public List<TableSchemaModel> GetTableSchemaData(string tableName)
        {
            List<TableSchemaModel> ret = null;
            var tableSchema = dbContext.Database.Connection.Database;
            string sql = string.Format("SELECT table_name TableName,column_Name ColumnName,is_nullable IsNullable,data_type DataType,character_maximum_length CharacterMaximumLength,column_comment ColumnComment,Column_Key ColumnKey FROM information_schema.COLUMNS WHERE table_schema='{0}' AND table_name = '{1}';", tableSchema, tableName);
            ret = ExecuteQuerySql<TableSchemaModel>(sql);
            return ret;
        }
        /// <summary>
        /// 查询表中字段关联的所有外键表信息
        /// </summary>
        /// <param name="tableName"></param>
        /// <returns></returns>
        public List<TableRefrenceModel> GetTableRefrenceData(string tableName)
        {
            List<TableRefrenceModel> ret = null;
            var tableSchema = dbContext.Database.Connection.Database;
            string sql = string.Format("SELECT table_name TableName,column_name ColumnName,REFERENCED_TABLE_NAME ReferencedTableName,REFERENCED_COLUMN_NAME ReferencedColumnName FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE table_schema='{0}' AND table_name = '{1}';", tableSchema, tableName);
            ret = ExecuteQuerySql<TableRefrenceModel>(sql);
            return ret;
        } 

        /// <summary>
        /// 生成Model类文件中的非导航属性内容,到bin/Files 目录 的 tableName.cs文件
        /// </summary>
        /// <param name="tableName">表名,也是生成的Model类名</param>
        public void GenerateModelJob(string tableName)
        {
            var data = taskRepository.GetTableSchemaData(tableName);
            if (data != null)
            {
                var refrenceData = taskRepository.GetTableRefrenceData(tableName);
                var priColumn = data.Where(o => o.ColumnKey == "PRI").First();
                StringBuilder sb = new StringBuilder();
                sb.Append(@"
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;

");
                sb.AppendFormat("    [Table(\"{0}\")]", tableName).AppendLine();
                sb.AppendFormat(@"    public partial class {0} : Entity<{1}>
", tableName, GetCSTypeFromDbType(priColumn.DataType)).Append("    {").AppendLine();
                foreach (var field in data)
                {
                    sb.AppendFormat(@"
        /// <summary>
        /// {0}
        /// </summary>
", field.ColumnComment);

                    switch (field.DataType)
                    {
                        case "varchar":
                        case "nvarchar":
                            {
                                sb.AppendFormat(@"        [StringLength({0})]
        [MaxLength({0})]
", field.CharacterMaximumLength);
                            }
                            break;
                        case "date":
                        case "bit":
                            {
                                sb.AppendFormat("        [Column(TypeName = \"{0}\")]", field.DataType).AppendLine();
                            }
                            break;
                    }
                    if (field.ColumnKey == "PRI")
                    {
                        sb.AppendFormat("        [Column(\"{0}\")]", field.ColumnName).AppendLine();
                        sb.AppendFormat("        public override {0} Id ", GetCSTypeFromDbType(field.DataType)).Append("{ get; set; }").AppendLine();
                    }
                    else
                    {
                        sb.AppendFormat("        public {0}{1} {2} ", GetCSTypeFromDbType(field.DataType), field.IsNullable == "YES" ? "?" : "", field.ColumnName).Append("{ get; set; }").AppendLine();
                    }
                }
                foreach (var refrence in refrenceData)
                {
                    sb.AppendFormat("        public virtual {0} {0} ", refrence.ReferencedTableName).Append("{ get; set; }").AppendLine();
                }
                sb.Append(@"
    }
}
");
                var str = sb.ToString();
                string saveDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Files\\");
                if (!Directory.Exists(saveDir)) Directory.CreateDirectory(saveDir);
                string saveFilePath = System.IO.Path.Combine(saveDir, tableName + ".cs");
                System.IO.File.AppendAllText(saveFilePath, str, Encoding.UTF8);
            }
        }

        /// <summary>
        /// Mysql数据库字段类型转化为C#字段类型
        /// </summary>
        /// <param name="dbType"></param>
        /// <returns></returns>
        private string GetCSTypeFromDbType(string dbType)
        {
            string ret = dbType;
            switch (dbType)
            {
                case "nvarchar":
                case "text":
                case "varchar": ret = "string"; break;
                case "datetime":
                case "date": ret = "DateTime"; break;
                case "bit": ret = "bool"; break;
                case "bigint": ret = "long"; break;
            }
            return ret;
        }





二、与Sql Server简单对比

 1、从上面可以看到,查询MySql表结构的语句非常简单,全部的信息全部可以从information_schema.COLUMNS 这个对象里面查,还有外键表字段等等关联关系,全部都可以从INFORMATION_SCHEMA.KEY_COLUMN_USAGE对象查出来,只要传入指定的数据库名和表名就行了,相对 来说,Sql Server就复杂很多,如果一样要生成这个Model类,估计会非常头痛!


2、刚接触Mysql感觉有一些坑,比如存储过程的使用和Sql Server不一样、在.Net的EF中Mysql事务的使用和Sql Server不一样。最大的不同是,Mysql可以设置语句是否立即执行,如果没设置为true,在程序中调用SQL语句操作数据,都不会成功保存到数据库,后面都要加一个 commit; 才行。

现在用过一段时间,还行,有些东西注意一下就和sql server差不多。





相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
SQL IDE Java
Java连接SQL Server数据库的详细操作流程
Java连接SQL Server数据库的详细操作流程
|
3天前
|
SQL Oracle 关系型数据库
MySQL、SQL Server和Oracle数据库安装部署教程
数据库的安装部署教程因不同的数据库管理系统(DBMS)而异,以下将以MySQL、SQL Server和Oracle为例,分别概述其安装部署的基本步骤。请注意,由于软件版本和操作系统的不同,具体步骤可能会有所变化。
21 3
|
9天前
|
SQL 存储 安全
数据库数据恢复—SQL Server数据库出现逻辑错误的数据恢复案例
SQL Server数据库数据恢复环境: 某品牌服务器存储中有两组raid5磁盘阵列。操作系统层面跑着SQL Server数据库,SQL Server数据库存放在D盘分区中。 SQL Server数据库故障: 存放SQL Server数据库的D盘分区容量不足,管理员在E盘中生成了一个.ndf的文件并且将数据库路径指向E盘继续使用。数据库继续运行一段时间后出现故障并报错,连接失效,SqlServer数据库无法附加查询。管理员多次尝试恢复数据库数据但是没有成功。
|
11天前
|
SQL 关系型数据库 MySQL
「Python入门」python操作MySQL和SqlServer
**摘要:** 了解如何使用Python的pymysql模块与MySQL数据库交互。首先,通过`pip install pymysql`安装模块。pymysql提供与MySQL的连接功能,例如创建数据库连接、执行SQL查询。在设置好MySQL环境后,使用`pymysql.connect()`建立连接,并通过游标执行SQL(如用户登录验证)。注意防止SQL注入,使用参数化查询。增删改操作需调用`conn.commit()`来保存更改。pymssql模块类似,但导入和连接对象创建略有不同。
15 0
「Python入门」python操作MySQL和SqlServer
|
15天前
|
SQL 存储 关系型数据库
关系型数据库SQL Server学习
【7月更文挑战第4天】
24 2
|
21天前
|
SQL 弹性计算 数据管理
数据管理DMS产品使用合集之sql server实例,已经创建了数据库,登录时提示实例已存在,该怎么处理
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
31 1
|
1月前
|
SQL 存储 关系型数据库
关系型数据库中的SQL Server
【6月更文挑战第11天】
59 3
|
1月前
|
SQL 存储 数据库
如何在SQLServer中创建数据库
在SQL Server中创建数据库,可通过SSMS的图形界面或T-SQL语句。在SSMS中,连接到服务器,右键“数据库”选择“新建数据库”,配置属性后点击确定。使用T-SQL,连接到服务器,编写CREATE DATABASE语句指定数据库名称、文件路径及大小信息,执行查询完成创建。确保有足够磁盘空间,并注意权限设置。
|
1月前
|
SQL XML Java
java与sql server数据库连接
在Java中连接SQL Server数据库,你通常需要使用JDBC (Java Database Connectivity)。以下是一个简单的步骤指南,帮助你建立连接: ### 1. **下载并
|
25天前
|
XML 关系型数据库 数据库
使用mybatis-generator插件生成postgresql数据库model、mapper、xml
使用mybatis-generator插件生成postgresql数据库model、mapper、xml
59 0