SmartDapper.UI -数据库反向生成实体
✨ 主要特性现代化 UI精美的深色主题界面无需任何前端框架依赖多数据库支持自动识别 SQL Server 和 MySQL 数据库零配置启动简单两行代码即可集成到项目中智能文件管理支持可视化文件夹树选择器自动查找解决方案根目录安全可靠支持访问令牌保护限制输出路径防止任意文件写入软删除生成可控支持开关“是否生成软删”是否自动添加[SoftDelete]特性自动包管理启用“自动添加软删除”且生成的实体包含[SoftDelete]时自动安装 SmartDapper 包⚡实时反馈即时的日志输出和操作反馈精准映射完整的数据库类型到 C# 类型映射智能过滤支持表名搜索、批量选择等便捷操作 安装通过 NuGet 包管理器安装dotnet add package SmartDapper.UI或者在csproj文件中添加PackageReference IncludeSmartDapper.UI Version1.1.2 / 快速开始1. 注册服务和中间件在Program.cs中添加以下代码using SmartDapper.UI.Extensions; var builder WebApplication.CreateBuilder(args); // 注册 SmartDapper.UI 服务 builder.Services.AddSmartDapperUi(options { // UI 访问路径类似 /swagger options.PathBase /smartdapper; // 输出根目录实体文件生成的根路径默认为当前目录 // options.OutputRootDirectory Directory.GetCurrentDirectory(); var solutionRoot Directory.GetParent(builder.Environment.ContentRootPath)?.Parent?.FullName ?? builder.Environment.ContentRootPath; options.OutputRootDirectory solutionRoot; // 可选设置访问令牌启用后需要在请求头中提供 // options.AccessToken your-secret-token; }); var app builder.Build(); // 启用 SmartDapper.UI 中间件 app.UseSmartDapperUi(); app.Run();2. 启动应用并访问 UI启动应用后在浏览器中访问http://localhost:5000/smartdapper3. 使用界面生成实体输入数据库连接字符串支持 SQL Server 和 MySQL点击检测数据库类型可选用于确认连接正确点击加载表系统会自动读取所有表选择要生成的表支持搜索、全选、反选配置输出选项SchemaSQL Server 默认dboMySQL 留空Namespace命名空间输出目录可使用浏览...按钮选择是否覆盖已存在文件是否生成软删自动添加软删除关闭后即使检测到IsDeleted等软删列也不会生成[SoftDelete]也不会触发 SmartDapper 包自动安装系统截图点击生成实体 使用示例SQL Server 示例// Program.cs builder.Services.AddSmartDapperUi(options { options.PathBase /smartdapper; options.OutputRootDirectory D:\MyProject; });在 UI 中输入连接字符串Serverlocalhost;DatabaseMyDb;User Idsa;PasswordPass123;TrustServerCertificateTrue;SchemadboNamespaceMyApp.Entities输出目录Models生成的实体类示例using System; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace MyApp.Entities { /// summary /// 用户表 /// /summary [Table(Users)] public class User { /// summary /// 用户ID /// /summary [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; } /// summary /// 用户名 /// /summary [Required] [MaxLength(50)] public string Username { get; set; } string.Empty; /// summary /// 邮箱 /// /summary [MaxLength(100)] public string? Email { get; set; } /// summary /// 创建时间 /// /summary public DateTime CreatedAt { get; set; } } }MySQL 示例// Program.cs builder.Services.AddSmartDapperUi(options { options.PathBase /smartdapper; options.OutputRootDirectory /home/user/projects/MyProject; });在 UI 中输入连接字符串Serverlocalhost;Port3306;Databasemydb;Userroot;Passwordpass;SslModeNone;Schema留空MySQL 使用 Database 作为 SchemaNamespaceMyApp.Entities输出目录Models⚙️ 配置选项SmartDapperUiOptions属性类型默认值说明PathBasestring/smartdapperUI 的访问路径前缀OutputRootDirectorystring当前工作目录实体文件生成的根目录所有输出路径会被限制在此目录下AccessTokenstring?null可选的访问令牌设置后需要在请求头X-SmartDapper-Token中提供高级配置示例builder.Services.AddSmartDapperUi(options { // 自动查找解决方案根目录 var solutionRoot FindSolutionRoot(Directory.GetCurrentDirectory()) ?? Directory.GetCurrentDirectory(); options.PathBase /code-generator; options.OutputRootDirectory solutionRoot; options.AccessToken builder.Configuration[SmartDapper:AccessToken]; }); // 辅助方法查找 .sln 文件所在目录 string? FindSolutionRoot(string startPath) { var dir new DirectoryInfo(startPath); while (dir ! null) { if (dir.GetFiles(*.sln).Any()) return dir.FullName; dir dir.Parent; } return null; } 安全配置启用访问令牌保护builder.Services.AddSmartDapperUi(options { options.AccessToken your-secret-token-here; });客户端请求时需要添加请求头POST /smartdapper/api/generate HTTP/1.1 Host: localhost:5000 X-SmartDapper-Token: your-secret-token-here Content-Type: application/json开发环境 vs 生产环境建议仅在开发环境启用 SmartDapper.UIvar builder WebApplication.CreateBuilder(args); if (builder.Environment.IsDevelopment()) { builder.Services.AddSmartDapperUi(options { options.PathBase /smartdapper; options.OutputRootDirectory FindSolutionRoot() ?? Directory.GetCurrentDirectory(); }); } var app builder.Build(); if (app.Environment.IsDevelopment()) { app.UseSmartDapperUi(); } app.Run();️ 数据库支持连接字符串示例SQL ServerServerlocalhost;DatabaseMyDb;User Idsa;PasswordPass123;TrustServerCertificateTrue; Server.;DatabaseMyDb;Integrated SecurityTrue;TrustServerCertificateTrue; Server192.168.x.xxx,1433;DatabaseMyDb;User Idsa;PasswordPass123;EncryptFalse;MySQLServerlocalhost;Port3306;Databasemydb;Userroot;Passwordpass;SslModeNone; Server192.168.x.xxx;Databasemydb;Userroot;Passwordpass;Charsetutf8mb4;自动数据库类型识别SmartDapper.UI 会根据连接字符串特征自动识别数据库类型数据库识别特征MySQLPort3306,SslMode,Charset,AllowUserVariablesSQL ServerTrustServerCertificate,Integrated Security,Initial Catalog,Data Source数据类型映射点击展开完整映射表 高级功能自动安装 SmartDapper 包当生成的实体类包含[SoftDelete]特性时且 UI 勾选了“自动添加软删除”SmartDapper.UI 会自动查找目标目录的.csproj文件检查是否已安装SmartDapper包如果未安装自动添加包引用在日志中提示安装结果这样可以确保生成的代码直接可用无需手动安装依赖。软删除支持SmartDapper.UI 会自动识别常见的软删除列并生成相应特性默认开启可在 UI 关闭“自动添加软删除 / 是否生成软删”[Table(Users)] public class User { [Key] public int Id { get; set; } public string Name { get; set; } string.Empty; /// summary /// 是否删除 /// /summary [SoftDelete] public bool IsDeleted { get; set; } }支持的软删除列名不区分大小写IsDeletedIsDeleteDeletedDelDeleteFlag文件夹树浏览器UI 提供了内置的文件夹树浏览器具有以下特性树形结构直观展示项目目录结构自动过滤排除bin、obj、node_modules、.git等无关目录智能定位自动查找解决方案根目录快速选择点击文件夹图标或名称即可选择 API 端点SmartDapper.UI 提供了以下 REST API 端点基于PathBase配置1. 检测数据库类型POST /smartdapper/api/detect Content-Type: application/json { connectionString: Serverlocalhost;Databasetest;... }响应{ databaseType: MySQL, message: 检测到 MySQL 数据库连接字符串 }2. 列出所有表POST /smartdapper/api/tables Content-Type: application/json { connectionString: Serverlocalhost;Databasetest;..., schema: dbo }响应[ { name: Users, schema: dbo, comment: 用户表 }, { name: Products, schema: dbo, comment: 产品表 } ]3. 生成实体类POST /smartdapper/api/generate Content-Type: application/json { connectionString: Serverlocalhost;Databasetest;..., schema: dbo, namespace: MyApp.Entities, outputDir: Models, tables: [Users, Products], overwrite: true, enableSoftDelete: true }说明enableSoftDelete是否生成软删是否自动添加[SoftDelete]特性默认true。当为false时即使存在IsDeleted等软删列也不会生成[SoftDelete]也不会触发 SmartDapper 包自动安装。响应{ tablesProcessed: 2, filesWritten: 2, outputFiles: [ D:\\MyProject\\Models\\User.cs, D:\\MyProject\\Models\\Product.cs ], errors: [] }4. 列出文件夹树GET /smartdapper/api/folders响应{ name: 解决方案根目录, path: ., children: [ { name: src, path: src, children: [...] }, { name: test, path: test, children: [...] } ] }⚠️ 注意事项通用注意事项输出路径安全所有生成的文件路径都会被限制在OutputRootDirectory配置的目录下防止任意文件写入攻击文件覆盖谨慎使用覆盖已存在文件选项避免意外覆盖手动修改的代码连接字符串安全不要将包含敏感信息的连接字符串硬编码在代码中建议使用配置文件或环境变量命名冲突注意数据库关键字和 C# 关键字的冲突生成器不会自动处理关键字转义SQL Server 特定注意事项默认 Schema如果不指定 Schema默认使用dbo信任证书开发环境建议在连接字符串中添加TrustServerCertificateTrue加密连接SQL Server 2022 默认需要加密连接NVARCHAR 类型生成的实体会正确映射为string支持 UnicodeMySQL 特定注意事项Schema 概念MySQL 的Database相当于 SQL Server 的Schema因此通常留空 Schema 字段端口号建议显式指定Port3306有助于数据库类型自动识别字符集建议使用Charsetutf8mb4支持完整的 Unicode 字符SSL 连接开发环境可以设置SslModeNone生产环境建议启用 SSL表名大小写MySQL 在 Linux 上默认表名区分大小写Windows 上不区分性能建议表数量如果数据库包含大量表100 张建议使用搜索过滤功能输出目录避免选择包含大量文件的目录可能影响文件夹树加载速度连接超时对于远程数据库建议在连接字符串中设置合适的超时时间 故障排除常见问题1. 无法连接到数据库现象点击加载表后提示连接失败解决方案检查连接字符串是否正确确认数据库服务正在运行检查防火墙设置对于 SQL Server尝试添加TrustServerCertificateTrue对于 MySQL尝试添加SslModeNone2. 找不到表现象加载表成功但列表为空解决方案SQL Server确认 Schema 设置是否正确默认为dboMySQL尝试将 Schema 字段留空确认数据库用户有足够的权限读取表结构3. 生成的文件路径错误现象提示非法输出路径解决方案检查OutputRootDirectory配置是否正确确保输出目录在允许的根目录下使用相对路径而非绝对路径4. 访问 UI 页面返回 401现象浏览器显示Unauthorized解决方案检查是否配置了AccessToken如果配置了令牌需要在请求头中添加X-SmartDapper-Token开发环境可以临时移除AccessToken配置5. 自动安装 SmartDapper 包失败现象日志提示未找到 .csproj 文件或安装失败解决方案确保输出目录位于项目目录内包含.csproj文件手动运行dotnet add package SmartDapper检查 NuGet 源配置是否正确 最佳实践解决方案级配置将OutputRootDirectory设置为解决方案根目录方便管理多个项目var solutionRoot FindSolutionRoot(Directory.GetCurrentDirectory()); options.OutputRootDirectory solutionRoot ?? Directory.GetCurrentDirectory();环境隔离生产环境不要启用 SmartDapper.UIif (builder.Environment.IsDevelopment()) { builder.Services.AddSmartDapperUi(); // ... }命名规范使用有意义的命名空间如ProjectName.Domain.Entities分层目录为不同模块的实体创建独立目录Models/ ├── Users/ │ ├── User.cs │ └── UserRole.cs └── Products/ ├── Product.cs └── Category.cs版本控制生成实体后及时提交到版本控制系统git add Models/ git commit -m chore: generate entity classes from database增量生成不要勾选覆盖已存在文件避免丢失手动添加的业务逻辑文档注释生成器会自动从数据库注释生成 XML 文档注释确保数据库表和列有完善的注释 与 SmartDapper 集成SmartDapper.UI 生成的实体类与 SmartDapper完美兼容using Dapper; using SmartDapper.Extensions; // 使用生成的实体类 var users await connection.QueryAsyncUser( SELECT * FROM Users WHERE IsDeleted 0); // 软删除支持自动过滤 IsDeleted 1 的记录 var activeUsers await connection.GetAllAsyncUser(); // Fluent API var user await connection.FromUser() .Where(u u.Username admin) .FirstOrDefaultAsync();