实体生成器是什么?

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

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

  在.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();
}
}

  

.Net Core 实体生成器的更多相关文章

  1. CSharp实体生成器

    专门为C#开发人员定制的一个实体生成器,以往的生成器功能达到了,但是很多细节未考虑到,所以我借鉴“先人”的一些已有的东西,重新定制了一个.当然,需要源码的同学,直接使用IL Spy这个小工具就可以看到 ...

  2. 【低码】asp.net core 实体类可生产 CRUD 后台管理界面

    前言介绍 喜欢小规模团队的"单打独斗",有的时候即使在大公司,也经常做着3-5个人团队的小项目,相信很多人有类似的经历. 本文介绍如何将项目中已存在的[实体类],直接生产出 CRUD 后台管理界面. ...

  3. oledb,odbc简易实体生成器.

    DataSet to code file(C#)工具. 方便自己写的odbc或者oledb的东西用的. sql server或者oracle等大数据库已经有EF的支持. 一些其他数据库还是用oledb ...

  4. 对Entity Framework Core的一次误会:实体状态不跟踪

    在 Entity Framework 中,当通过 EF 使用 LINQ 查询获取到一个实体(实际得到的是 EF 动态生成的实体类的代理类的实例)时,这个实体的状态默认是被跟踪的.所以,当你修改实体的某 ...

  5. EF Core 中多次从数据库查询实体数据,DbContext跟踪实体的情况

    使用EF Core时,如果多次从数据库中查询一个表的同一行数据,DbContext中跟踪(track)的实体到底有几个呢?我们下面就分情况讨论下. 数据库 首先我们的数据库中有一个Person表,其建 ...

  6. EF Core 2.0中如何手动映射数据库的视图为实体

    由于Scaffold-DbContext指令目前还不支持自动映射数据库中的视图为实体,所以当我们想使用EF Core来读取数据库视图数据的时候,我们需要手动去做映射,本文介绍如何在EF Core中手动 ...

  7. EF Core中怎么实现自动更新实体的属性值到数据库

    我们在开发系统的时候,经常会遇到这种需求数据库表中的行被更新时需要自动更新某些列. 数据库 比如下面的Person表有一列UpdateTime,这列数据要求在行被更新后自动更新为系统的当前时间. Pe ...

  8. EF Core中如何通过实体集合属性删除从表的数据

    假设在数据库中有两个表:Person表和Book表,Person和Book是一对多关系 Person表数据: Book表数据: 可以看到数据库Book表中所有的数据都属于Person表中"F ...

  9. EF Core怎么只Update实体的部分列数据

    下面是EF Core中的一个Person实体: public partial class Person { public int Id { get; set; } public string Code ...

随机推荐

  1. 【博客搭建】Typecho个人博客搭建,快速安装,超小白(很简单的)

    使用Typecho框架一个月又十二天了,就目前感觉来说,整体还不错,很多方面都支持个性化,二次开发,但是目前MD编辑器有一丢丢问题,不能同步滚动条滚动,就是编辑器区域滚动,预览区域没有动静,需要两边都 ...

  2. Android/iOS内嵌Unity开发示例

    Unity 与 Android/iOS 交叉开发主要有两种方式,以 Android 为例,一是 Android 生成 jar 或者 aar 包,导入到 unity3d plugin/bin/ 目录下: ...

  3. java IO流 (八) RandomAccessFile的使用

    1.随机存取文件流:RandomAccessFile 2.使用说明: * 1.RandomAccessFile直接继承于java.lang.Object类,实现了DataInput和DataOutpu ...

  4. Unity3D Demo项目开发记录

    前言 经过一段时间的学习与实际开发,unity3D也勉强算是强行入门了,正所谓好记性不如烂笔头,更何况本人并非专业从事unity3D开发,会一点C#但也并不熟悉,为了避免后期遗忘,因此特意整理了一个D ...

  5. 手写简易的Mybatis

    手写简易的Mybatis 此篇文章用来记录今天花个五个小时写出来的简易版mybatis,主要实现了基于注解方式的增删查改,目前支持List,Object类型的查找,参数都是基于Map集合的,可以先看一 ...

  6. CentOS 无法加载 ntfs文件系统类型解决办法

    问题: CentOS无法加载ntfs 文件系统类型的移动硬盘. 解决办法: 1.下载rpmforge,下载对应的版本.(对应的CentOS版本,并区分32位和64位). 例如: wget http:/ ...

  7. OSCP Learning Notes - Exploit(2)

    Compiling an Exploit Exercise: samba exploit 1. Search and download the samba exploit source code fr ...

  8. 学习mysql,你必须要了解的 “ 索引 ” 基本知识

    1.select * 对效率的影响在我们平时的代码编写或面试题中,很多人都会疑惑:select * 到底合理吗? 如果说不合理,为什么?如果说合理,原因又是什么? 1).阿里规范 在阿里java规范中 ...

  9. 区间dp复习 之 乘积最大

    题目描述 今年是国际数学联盟确定的"2000--世界数学年",又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一 ...

  10. Linux内核功能介绍及如何使用保护您的网页安全

    在本文中,我们快速浏览了Linux内核的许可流程,并向您展示了如何使用它们来保护您的网页或应用安全 传统上,Linux内核通过以下两类来区分其进程: 特权进程:这些进程使用户可以绕过所有内核权限检查. ...