zoukankan      html  css  js  c++  java
  • .Net Core 实体生成器

    实体生成器是什么?

      实体生成器的功能就是自动将数据库中的表以及字段 转化成我们 高级编程语言中的实体类。

    我们为什么要用实体生成器

      在.net core开发环境下,我们可以使用efcore这个orm来根据数据库中的表来自动生成实体类,而使用其它orm的时候,一般情况下都需要我们自己对照数据库中的表和字段,一个个添加实体类和类中的属性。因此使用实体生成器,可以减少我们重复劳动的工作量,让我们把更多的时间花在业务处理上。

    实现过程:

    创建实战项目EntityGenerator:

        这里我使用的VS2019开发工具,我们选择.net core控制台应用程序。

      使用json文件进行数据库的配置:

        进行nuget包安装,安装成功后可以在依赖项中查看到对应的包。

          Mysql.Data

           Microsoft.Extensions.Configuration

           Microsoft.Extensions.Configuration.Json

           Microsoft.Extensions.Configuration.Abstractions

          Microsoft.Extensions.Configuration.EnvironmentVariables

    在项目根目录创建appsettings.json文件,并进行数据库连接的配置,文件内容如下图所示:

    {
      "ConnectionStrings": {
        "TestSql": "Server=127.0.0.1;User Id=root;Password=123456;Database=Test;"
      }
    }

      进行数据库相关的操作

              nuget包安装,安装成功后可以在依赖项中查看到对应的包。

          Dapper

          Mysql.Data

        创建数据库访问层EntityGeneratorDao,这里用到了之前的获取json配置的IConfigurationRoot类。

        实现从数据库获取相应表的方法GetTables。

        实现从数据库获取表相应字段的方法GetSchemaTables,文件内容如下图所示:

    public class EntityGeneratorDao
        {
            protected string ConnStr;
    
            public EntityGeneratorDao(IConfigurationRoot configurationRoot)
            {
                ConnStr = configurationRoot.GetSection("ConnectionStrings:TestSql").Value;
            }
    
            /// <summary>
            /// 获取数据库中的表
            /// </summary>
            /// <returns></returns>
            public DataTable GetTables()
            {
                using(var conn = new MySqlConnection(ConnStr))
                {
                    conn.Open();
                    return conn.GetSchema("Tables");
                }
            }
    
            /// <summary>
            /// 获取表对应的字段信息
            /// </summary>
            /// <param name="dataRow"></param>
            /// <returns></returns>
            public DataTable GetSchemaTable(string tableName)
            {
                using (var conn = new MySqlConnection(ConnStr))
                {
                    conn.Open();
                    DataTable dataTable = new DataTable(tableName);
                    var reader = conn.ExecuteReader($"Select * From INFORMATION_SCHEMA.COLUMNS where table_name = '{tableName}'");
                    dataTable.Load(reader);
                    return dataTable;
                }
            }
        }

      根据获取到的字段,进行内容的拼接,文件内容如下图所示:

    public class EntityGeneratorService
        {
            protected EntityGeneratorDao entityGeneratorDao;
    
            public EntityGeneratorService(IConfigurationRoot configurationRoot)
            {
                entityGeneratorDao = new EntityGeneratorDao(configurationRoot);
            }
    
            /// <summary>
            /// 
            /// </summary>
            /// <param name="dataTable"></param>
            /// <param name="className"></param>
            public string GenerateEntityContent(DataTable dataTable, string tableName, string tableComment)
            {
                var nameSpace = MethodBase.GetCurrentMethod().DeclaringType.Namespace;
                var stringBuilder = new StringBuilder();
                stringBuilder.AppendLine("using System;");
                stringBuilder.AppendLine("using System.Data;");
                stringBuilder.AppendLine($"namespace {nameSpace}.Entitys");
                stringBuilder.AppendLine("{");
                string prefix = "	";
                stringBuilder.AppendLine($"{prefix}/// <summary>");
                stringBuilder.AppendLine($"{prefix}///{tableComment}");
                stringBuilder.AppendLine($"{prefix}/// </summary>");
                stringBuilder.AppendLine($"{prefix}public class {tableName}");
                stringBuilder.AppendLine($"{prefix}{{");
    
                string filedPrefix = "		";
                //默认在当前可执行目录下生成实体
                foreach (DataRow dataRow in dataTable.Rows)
                {
                    //添加注释
                    stringBuilder.AppendLine($"{filedPrefix}/// <summary>");
                    stringBuilder.AppendLine($"{filedPrefix}///{dataRow["COLUMN_COMMENT"]}");
                    stringBuilder.AppendLine($"{filedPrefix}/// </summary>");
                    string dataType = dataRow["DATA_TYPE"].ToString();
                    Type type = TypeExtensions.Convert(dataType);
    
                    string nullableStr = type.BaseType.Name == "ValueType" && dataRow["IS_NULLABLE"].ToString() == "YES" ? "?" : "";
                    string defaultVlaue = dataRow["COLUMN_DEFAULT"].ToString() == string.Empty ? "" : $"={dataRow["COLUMN_DEFAULT"].ToString()};";
                    //添加字段声明
                    stringBuilder.AppendLine($"{filedPrefix}public {type.GetAliasName()}{nullableStr} {dataRow["COLUMN_NAME"]} {{ get; set; }} {defaultVlaue}");
                }
    
                stringBuilder.AppendLine($"{prefix}}}");
                stringBuilder.AppendLine($"}}");
    
                return stringBuilder.ToString();
            }
        }

      将之前的步骤进行串联,并且将拼接的内容保存到我们的项目目录中,文件内容如下图所示:

    class Program
        {
            static void Main(string[] args)
            {
                var builder = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddEnvironmentVariables();
    
                var configuration = builder.Build();
    
                EntityGeneratorDao entityGeneratorDao = new EntityGeneratorDao(configuration);
                EntityGeneratorService entityGeneratorService = new EntityGeneratorService(configuration);
    
                var tables = entityGeneratorDao.GetTables();
    
                foreach (DataRow row in tables.Rows)
                {
                    string tableName = row["TABLE_NAME"].ToString();
                    string tableComment = row["TABLE_COMMENT"].ToString();
    
                    var schemaTable = entityGeneratorDao.GetSchemaTable(tableName);
                    string content = entityGeneratorService.GenerateEntityContent(schemaTable, tableName, tableComment);
                    File.WriteAllBytes($"{Directory.GetCurrentDirectory().Substring(0, Directory.GetCurrentDirectory().IndexOf("bin"))}/Entitys/{tableName}.cs",Encoding.UTF8.GetBytes(content));
                }
    
                Console.ReadLine();
            }
        }

      

  • 相关阅读:
    基于xtrabackup的PointInTime Recovery备份恢复
    使用折半查找法删除
    五月第二周
    MySQL 5.5 外键不能引用分区表主键
    MYSQL 登录漏洞,Percona Server说明
    Detectron2学习笔记 Sanny.Liu
    取客户MAP地址
    DataReader转实体<T>
    从程序员到翻译的感受
    .net中的浅拷贝和深拷贝
  • 原文地址:https://www.cnblogs.com/chenhaoblog/p/11923236.html
Copyright © 2011-2022 走看看