1. SmartDapper.UI 项目概述
SmartDapper.UI 是一款专注于数据库反向生成实体类的可视化工具。作为长期使用Dapper进行数据库开发的工程师,我深知手动编写实体类的痛苦——每次数据库表结构变更都需要同步修改代码,既耗时又容易出错。这个工具正是为了解决这个痛点而生。
它通过直观的UI界面连接数据库,自动扫描表结构并生成对应的C#实体类,支持SQL Server、MySQL、PostgreSQL等主流数据库。与常规代码生成器不同,SmartDapper.UI特别针对Dapper的使用场景进行了优化,生成的实体类天然适配Dapper的轻量级ORM特性。
2. 核心功能解析
2.1 数据库连接与元数据提取
工具内置多数据库连接驱动,通过ADO.NET标准接口获取数据库元信息。连接配置支持:
- 基础连接字符串设置
- 连接测试与验证
- 多环境配置保存与切换
元数据提取过程会读取:
- 表基本信息(表名、注释)
- 列定义(字段名、数据类型、长度、是否可空)
- 主键/外键约束
- 索引信息
提示:对于大型数据库,建议通过表名过滤减少加载时间,特别是在开发环境连接生产库时。
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实现,主要功能区域:
- 数据库连接面板
- 表选择树形列表
- 生成选项配置区:
- 命名风格(PascalCase/camelCase)
- 是否生成注释
- 是否包含数据注解
- 输出目录设置
- 实时预览窗口
3. 技术实现细节
3.1 架构设计
整体采用MVVM模式分层:
Presentation Layer (WPF) ↓ Business Logic Layer ↓ Data Access Layer (ADO.NET) ↓ Database依赖注入容器管理各模块:
- DbConnector:数据库连接管理
- MetadataReader:元数据提取
- CodeGenerator:代码生成引擎
- FileExporter:文件输出
3.2 类型映射系统
内置的默认类型映射表:
| 数据库类型 | C#类型 | 特殊处理 |
|---|---|---|
| varchar/nvarchar | string | 根据长度添加StringLength注解 |
| int | int | 主键标记为Key注解 |
| datetime | DateTime | 可空版本自动处理 |
| decimal | decimal | 精度/小数位数保留 |
| bit | bool | 自动转换 |
支持通过配置文件自定义映射规则:
<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 团队协作方案
推荐的工作流程:
- 将生成的实体类放入"Generated"文件夹
- 通过"部分类"扩展功能
- 在版本控制中忽略生成的代码
- 在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 性能优化技巧
对于大型数据库:
- 使用异步加载表列表
- 实现分页加载列信息
- 缓存数据库元数据
- 后台生成线程处理
6. 常见问题解决
6.1 连接问题排查
常见错误及解决方案:
| 错误现象 | 可能原因 | 解决方法 |
|---|---|---|
| 连接超时 | 网络问题/防火墙 | 检查端口开放情况 |
| 登录失败 | 凭据错误 | 验证用户名密码 |
| 缺少驱动程序 | 未安装对应数据库驱动 | 安装官方驱动 |
| 仅显示系统表 | 权限不足 | 授予用户元数据查询权限 |
6.2 生成代码问题
典型代码问题处理:
类型映射错误
- 检查自定义类型映射表
- 验证数据库字段类型
命名冲突
- 调整命名转换规则
- 使用自定义名称覆盖
注释缺失
- 确保数据库表/列有注释
- 开启生成注释选项
6.3 扩展性建议
二次开发方向:
- 插件系统支持
- 更多数据库支持(如MongoDB)
- 生成仓储接口
- 单元测试框架集成
- 领域驱动设计支持
在实际项目中使用时,我建议将生成代码作为基础设施层的一部分,配合Dapper的扩展方法实现高效数据访问。对于频繁变更的数据库结构,可以设置定时生成任务,确保代码与数据库保持同步。