MSSQL表自动生成实体类实现快速开发

介绍

在软件开发中,常常需要与数据库打交道。其中一个常见问题就是需要将数据库表转换为实体类,以便于在代码中进行操作。手动编写实体类的过程非常繁琐,特别是在面对复杂的表结构时。因此,自动化生成实体类的工具变得非常受欢迎。

本文介绍一种基于MSSQL数据库的自动生成实体类的方法,旨在简化开发流程,提高开发效率。

方案

我们使用C#语言,通过读取MSSQL数据库的元数据,自动生成对应的实体类。其实现原理如下:

连接MSSQL数据库,并读取数据库元数据。

解析元数据,生成实体类文件。

连接MSSQL数据库

我们用到了Dapper这个ORM库。首先,需要在项目中安装Dapper Nuget包:

Install-Package Dapper

接着,我们需要定义连接字符串,以便连接数据库:

string connString = "Data Source=(local);Initial Catalog=DemoDB;Integrated Security=True";

这里,我们以本地数据库DemoDB为例。

读取数据库元数据

连接到数据库之后,我们需要读取元数据,以便自动生成实体类。下面的代码可以将数据库中的所有表名读取到一个List集合中:

using(var conn = new SqlConnection(connString))

{

conn.Open();

List tableNames = conn.Query("SELECT Name FROM SysObjects Where XType='U' ORDER BY Name").ToList();

}

注意,我们使用了Dapper库的Query方法来执行SQL语句,并将结果转换为List集合。

接着,我们需要读取每个表的列信息:

foreach(var tableName in tableNames)

{

var tableColumns = conn.Query($@"SELECT

Col.Column_Name, Data_Type, Character_Maximum_Length, Is_Nullable,Is_Identity, Col.Column_Description

FROM

Information_Schema.Columns Col

JOIN

Information_schema.tables tab

ON

Col.table_name = tab.table_name

WHERE

tab.table_name = '{tableName}'").ToList();

}

我们使用了$字符来开启字符串内插,从而可以直接在SQL语句中使用变量。Query方法会将查询结果转换为List<dynamic>类型,我们可以通过遍历dynamic对象的成员变量,获取列信息。

生成实体类文件

我们将自动生成的实体类存储在磁盘上,以方便查看和调用。在生成实体类文件之前,我们需要对读取到的列信息进行解析。以下代码定义了一个Column类,用于存储列信息:

public class Column

{

public string Name {get;set;}

public string Type {get;set;}

public int? Length {get;set;}

public bool IsNullable {get;set;}

public bool IsIdentity {get;set;}

public string Description {get;set;}

}

接着定义了一个Table类,用于存储表和列的信息:

public class Table

{

public string Name {get;set;}

public string ClassName {get;set;}

public List<Column> Columns {get;set;}

}

有了Column和Table类之后,我们就可以生成实体类文件了:

var template = @"

using System;

public class {{ClassName}}

{

{{#Columns}}

///

/// {{Description}}

///

{{#if IsIdentity}}

[Key]

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

{{/if}}

public {{Type}} {{Name}} {( {{#if IsNullable}} get; set; {{#else}} get; set; {{/if}} )}

{{/Columns}}

}";

foreach (var table in tables)

{

var result = Razor.Parse(template, table);

var dir = $"{rootDir}\\Model";

var fileName = $"{table.ClassName}.cs";

var file = new FileInfo(Path.Combine(dir, fileName));

if(!Directory.Exists(dir)) Directory.CreateDirectory(dir);

if(!file.Exists || force)

File.WriteAllText(file.FullName, result);

}

上述代码中使用了Razor模版引擎,将读取到的Table对象与模版进行绑定,生成实体类文件。模版中使用了一些if语句,以便根据列信息生成不同的代码。例如,如果列是Identity列,则在生成属性时添加Key和DatabaseGenerated属性。我们还利用了C# 6.0引入的字符串内插,使代码更加简洁。

总结

本文介绍了一种基于MSSQL数据库的自动生成实体类的方法。使用该方法可以大大减少手动编写实体类的工作量,提高开发效率。当然,该方法也存在一些不足之处,例如无法完全适应所有的表结构,因此在使用过程中需要根据具体情况进行调整。

数据库标签