☰
SmartDapper.UI:数据库反向生成C#实体类工具详解
2026/10/26 6:35:28 网站建设 项目流程

1. SmartDapper.UI 项目概述

SmartDapper.UI 是一款专注于数据库反向生成实体类的可视化工具。作为长期使用Dapper进行数据库开发的工程师,我深知手动编写实体类的痛苦——每次数据库表结构变更都需要同步修改代码,既耗时又容易出错。这个工具正是为了解决这个痛点而生。

它通过直观的UI界面连接数据库,自动扫描表结构并生成对应的C#实体类,支持SQL Server、MySQL、PostgreSQL等主流数据库。与常规代码生成器不同,SmartDapper.UI特别针对Dapper的使用场景进行了优化,生成的实体类天然适配Dapper的轻量级ORM特性。

2. 核心功能解析

2.1 数据库连接与元数据提取

工具内置多数据库连接驱动,通过ADO.NET标准接口获取数据库元信息。连接配置支持:

  • 基础连接字符串设置
  • 连接测试与验证
  • 多环境配置保存与切换

元数据提取过程会读取:

  1. 表基本信息(表名、注释)
  2. 列定义(字段名、数据类型、长度、是否可空)
  3. 主键/外键约束
  4. 索引信息

提示:对于大型数据库,建议通过表名过滤减少加载时间,特别是在开发环境连接生产库时。

2.2 实体类生成引擎

生成引擎采用模板化设计,核心处理流程:

// 伪代码示例 foreach(var table in schema.Tables) { var classCode = new StringBuilder(); // 添加using语句 classCode.AppendLine("using System;"); // 生成类定义 classCode.AppendLine($"public class {table.ClassName}"); classCode.AppendLine("{"); // 生成属性 foreach(var column in table.Columns) { classCode.AppendLine($" public {column.NetType} {column.PropertyName} {{ get; set; }}"); } classCode.AppendLine("}"); SaveToFile(table.ClassName + ".cs"); }

关键特性包括:

  • 类型映射系统(DB类型→C#类型)
  • 命名转换规则(表名→类名,字段名→属性名)
  • 可配置的代码样式(缩进、大括号位置等)

2.3 可视化配置界面

UI层采用WPF实现,主要功能区域:

  1. 数据库连接面板
  2. 表选择树形列表
  3. 生成选项配置区:
    • 命名风格(PascalCase/camelCase)
    • 是否生成注释
    • 是否包含数据注解
    • 输出目录设置
  4. 实时预览窗口

3. 技术实现细节

3.1 架构设计

整体采用MVVM模式分层:

Presentation Layer (WPF) ↓ Business Logic Layer ↓ Data Access Layer (ADO.NET) ↓ Database

依赖注入容器管理各模块:

  • DbConnector:数据库连接管理
  • MetadataReader:元数据提取
  • CodeGenerator:代码生成引擎
  • FileExporter:文件输出

3.2 类型映射系统

内置的默认类型映射表:

数据库类型C#类型特殊处理
varchar/nvarcharstring根据长度添加StringLength注解
intint主键标记为Key注解
datetimeDateTime可空版本自动处理
decimaldecimal精度/小数位数保留
bitbool自动转换

支持通过配置文件自定义映射规则:

<TypeMappings> <add DbType="tinyint" NetType="byte" /> <add DbType="uniqueidentifier" NetType="Guid" /> </TypeMappings>

3.3 命名转换策略

实现的核心转换逻辑:

public static string ToPascalCase(string dbName) { // 处理下划线命名法 var parts = dbName.Split('_'); return string.Join("", parts.Select(p => p.Length > 0 ? char.ToUpper(p[0]) + p.Substring(1).ToLower() : "")); }

支持多种命名风格转换:

  • 保持原样(user_name → user_name)
  • 帕斯卡命名(user_name → UserName)
  • 驼峰命名(user_name → userName)
  • 自定义分隔符转换

4. 高级功能实现

4.1 关系映射生成

对于外键关系,可配置生成导航属性:

public class Order { public int Id { get; set; } public int CustomerId { get; set; } // 生成的导航属性 public virtual Customer Customer { get; set; } }

支持的关系配置选项:

  • 单向/双向导航
  • 延迟加载配置
  • 集合属性生成(一对多关系)

4.2 数据注解支持

可选的注解生成包括:

[Table("tbl_user")] public class User { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; } [Required] [StringLength(50)] public string Name { get; set; } [Column("create_time")] public DateTime CreateTime { get; set; } }

4.3 部分类生成

支持将实体类拆分为多个文件:

User.cs User.Metadata.cs

便于在手动编写的部分中添加业务逻辑,同时保留自动生成的部分可随时更新。

5. 使用技巧与最佳实践

5.1 团队协作方案

推荐的工作流程:

  1. 将生成的实体类放入"Generated"文件夹
  2. 通过"部分类"扩展功能
  3. 在版本控制中忽略生成的代码
  4. 在CI/CD流程中加入生成步骤

5.2 模板自定义

高级用户可编辑T4模板来定制生成逻辑:

<#@ template language="C#" #> <#@ import namespace="System.Collections.Generic" #> <# foreach(var table in Tables) { #> // 自定义类头注释 /// <summary> /// <#= table.Comment #> /// </summary> public partial class <#= table.ClassName #> { <# foreach(var col in table.Columns) { #> public <#= col.NetType #> <#= col.PropertyName #> { get; set; } <# } #> } <# } #>

5.3 性能优化技巧

对于大型数据库:

  1. 使用异步加载表列表
  2. 实现分页加载列信息
  3. 缓存数据库元数据
  4. 后台生成线程处理

6. 常见问题解决

6.1 连接问题排查

常见错误及解决方案:

错误现象可能原因解决方法
连接超时网络问题/防火墙检查端口开放情况
登录失败凭据错误验证用户名密码
缺少驱动程序未安装对应数据库驱动安装官方驱动
仅显示系统表权限不足授予用户元数据查询权限

6.2 生成代码问题

典型代码问题处理:

  1. 类型映射错误

    • 检查自定义类型映射表
    • 验证数据库字段类型
  2. 命名冲突

    • 调整命名转换规则
    • 使用自定义名称覆盖
  3. 注释缺失

    • 确保数据库表/列有注释
    • 开启生成注释选项

6.3 扩展性建议

二次开发方向:

  1. 插件系统支持
  2. 更多数据库支持(如MongoDB)
  3. 生成仓储接口
  4. 单元测试框架集成
  5. 领域驱动设计支持

在实际项目中使用时,我建议将生成代码作为基础设施层的一部分,配合Dapper的扩展方法实现高效数据访问。对于频繁变更的数据库结构,可以设置定时生成任务,确保代码与数据库保持同步。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询