实体生成器是什么?
实体生成器的功能就是自动将数据库中的表以及字段 转化成我们 高级编程语言中的实体类。
我们为什么要用实体生成器
在.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(); } }