.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 = "\t";
            stringBuilder.AppendLine($"{prefix}/// <summary>");
            stringBuilder.AppendLine($"{prefix}///{tableComment}");
            stringBuilder.AppendLine($"{prefix}/// </summary>");
            stringBuilder.AppendLine($"{prefix}public class {tableName}");
            stringBuilder.AppendLine($"{prefix}{{");

            string filedPrefix = "\t\t";
            //默认在当前可执行目录下生成实体
            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();
        }
    }

 

  

posted on 2019-11-24 17:21  幕友皎敖奔乾  阅读(976)  评论(0编辑  收藏  举报

导航