新闻中心

Dapper怎么实现一个简单的ORM代码生成器 Dapper T4模板生成实体

2025-12-15
浏览次数:
返回列表
Dapper 配合 T4 模板可基于数据库元数据(如 sys.tables/sys.columns)自动生成 C# 实体类,支持类型映射、主键识别、空值判断及 Dapper 特性标注,轻量可控且可定制。

dapper怎么实现一个简单的orm代码生成器 dapper t4模板生成实体

用 Dapper 配合 T4 模板生成实体类,核心是利用数据库元数据(如 INFORMATION_SCHEMA 或系统视图)+ T4 的文本生成能力,自动生成与表结构一一对应的 C# 实体类。它不依赖第三方 ORM 代码生成器,轻量、可控、可定制。

准备数据库连接和元数据查询

在 T4 模板中需要能访问数据库,获取表名、列名、数据类型、是否为空、主键等信息。推荐用 SQL Server 的 sys.tablessys.columns 查询(其他数据库类似):

  • SqlConnection 连接数据库(T4 中支持 System.Data.SqlClientMicrosoft.Data.SqlClient
  • 执行类似下面的 SQL 获取字段信息(含类型映射、是否主键、是否自增等):
SELECT t.name AS TableName, c.name AS ColumnName, ty.name AS SqlType, c.max_length, c.precision, c.scale, c.is_nullable, c.is_identity, ISNULL(pk.is_primary_key, 0) AS IsPrimaryKey FROM sys.tables t INNER JOIN sys.columns c ON t.object_id = c.object_id INNER JOIN sys.types ty ON c.user_type_id = ty.user_type_id LEFT JOIN (SELECT object_id, column_id, 1 as is_primary_key FROM sys.index_columns ic INNER JOIN sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id WHERE i.is_primary_key = 1) pk ON c.object_id = pk.object_id AND c.column_id = pk.column_id WHERE t.is_ms_shipped = 0 ORDER BY t.name, c.column_id

编写基础 T4 模板(.tt 文件)

新建一个 Models.tt 文件,顶部添加连接字符串和引用:

  • 定义连接字符串(建议从配置文件读取或硬编码测试用)

模板主体遍历表 → 遍历字段 → 生成属性,注意处理 SQL 类型到 C# 类型的映射(如 int, string, DateTime?, bool?),并加 [Column][Key] 等 Dapper 常用特性(需引入 Dapper 命名空间)。

Blackink AI纹身生成 Blackink AI纹身生成

创建类似纹身的设计,生成独特纹身

Blackink AI纹身生成 80 查看详情 Blackink AI纹身生成

类型映射与特性标注(关键细节)

SQL Server 类型转 C# 类型不能只看名字,要结合精度、长度、空值判断:

  • varchar(n)/nvarchar(n)string(n ≤ 4000 通常不加 [StringLength];若需校验可按需加)
  • bitbool?(因可能为 NULL)或 bool(配合 ISNULL(col,0) 查询时)
  • datetime/datetime2DateTime?
  • int/bigintint?/long?(主键且 is_identity=1 可标 [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  • 所有字段加 [Column("ColumnName")],确保 Dapper 映射时不依赖命名约定

生成后自动保存为 .cs 文件(可选增强)

T4 默认输出到一个文件,但通常希望每张表一个实体类。可用 配合循环内多次调用 this.GenerationEnvironment 并写入不同文件(需启用 hostspecific="true"):

  • File.WriteAllText(Host.ResolvePath($"{tableName}.cs"), content); 单独保存(需添加
  • 注意:VS 中 T4 不支持直接写多文件,需配合自定义生成逻辑或改用 MSBuild + TextTransform 工具
  • 更稳的方式:生成一个包含所有实体的 Models.generated.cs,再手动拆分或用脚本后处理

基本上就这些。T4 + Dapper 实体生成不复杂但容易忽略类型空值判断和主键识别逻辑,跑通一次后可封装成公司内部模板,配合 CI 自动更新实体。

以上就是Dapper怎么实现一个简单的ORM代码生成器 Dapper T4模板生成实体的详细内容,更多请关注其它相关文章!


# 自动生成  # 商城seo推广引流话术  # 巴中推广网站  # 营口抖音关键词排名公司  # 劳务外包的营销推广策略  # 亳州正规seo推广  # 独特网站建设方案  # 淘宝客营销计划推广  # 金寨县seo外包  # 新店开业的线上营销推广方案  # 杭州SEO招聘软件  # 分片  # 客户端  # 编码  # 多线程  # 如何使用  # 实体类  # 遍历  # 代码生成器  # 主键  # c#  # 配置文件  # microsoft  # 工具  # app 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 必由学官网首页入口 必由学教师网页版登录指南  高德地图总提示网络异常怎么办 高德地图离线导航设置与网络排查方法  mysql如何设置表访问权限_mysql表访问权限配置  Golang如何测试channel通信行为_Golang channel通信测试与分析方法  QQ邮箱网页版入口页面 QQ邮箱在线登录入口官网  DLsite中文平台入口 DLsite官网内容在线查看  Mac怎么使用表情符号_Mac Emoji快捷键面板  抖音从哪里进入网页版_抖音官方入口链接  AO3官网镜像链接 Archive of Our Own同人文在线浏览  HuggingFaceEmbeddings中向量嵌入维度调整的限制与理解  Win10快速启动功能利弊分析 Win10开启或关闭快速启动教程【技巧】  lar*el怎么安全地存储和获取配置文件中的敏感信息_lar*el敏感信息安全存储方法  聚水潭ERP登录页面入口 聚水潭ERP官网登录界面  在哪找SublimeJ远程工具_SFTP插件配置教程  126邮箱账号注册 电脑版登录入口  PDF怎么合并PDF并保持格式_PDF合并文件保持排版教程  解决Bootstrap卡片顶部边距导致背景图下移的问题  uc浏览器网页版极速入口 uc网页浏览器网页版流畅体验  CSS Flexbox如何实现多行排列_flex-wrap wrap自动换行显示  Win10桌面图标出现小盾牌怎么办 Win10去除UAC图标教程【解决】  Angular响应式表单:实现提交后表单及按钮的禁用与只读化  iCloud登录入口网页版 苹果iCloud官网登录  AI泡沫首次被“刺破”:GPU十年都无法存活!  将HTML Canvas内容转换为可上传的图像文件(File对象)  解决 MongoDB 聚合查询中对象数组 _id 匹配问题  c++如何实现一个简单的ECS框架_c++数据驱动设计与游戏开发  微信网页版登录教程_微信网页版登录入口在哪  C++如何实现异步操作_C++11使用std::future和std::async进行异步编程  如何在CSS中使用visited与link控制链接颜色_visited link伪类配合  解决macOS Tkinter应用双击启动崩溃:PyInstaller打包指南  《主播少女的秘密账号迷宫》首支宣传片  React/Next.js中实现列表项的动态移动与状态管理:兼论唯一键的重要性  QQ邮箱网页版快速登录 QQ邮箱邮箱账号官方入口地址  MAC怎么在地图App里使用“四处看看”_MAC体验部分城市的3D实景街景  J*a 递归快速排序中静态变量的状态管理与陷阱  如何使用纯J*aScript判断Input元素是否在特定类容器内  Promise错误处理:在catch后终止链式then执行的策略  Go与Ruby之间实现AES加密互通:CFB模式下的密钥长度匹配策略  vivo云服务网页版登录 怎么登录vivo云服务网页版  包子漫画官方网站在线链接-包子漫画在线阅读平台主页地址  护手霜蹭到袖口上了如何清洗? 怎样避免留下一圈油印?  mysql通配符支持数字匹配吗_mysql通配符能否用于数字匹配的解析  使用CSS更改登录屏幕输入框中PNG图标颜色的策略与局限性  搜狗浏览器如何使用密码生成器创建强密码 搜狗浏览器内置密码安全工具  J*aScript中高效管理与清空动态列表:避免循环陷阱  如何在 Excel Online 和 Google 表格中更改日期格式  C++的std::forward_list怎么用_C++ STL中单向链表容器的特点与应用  知音漫客官网漫画下载_知音漫客网页版阅读记录  Python:递归比较文件夹内容并找出特定类型文件的差异  NRF24L01数据传输深度解析:解决大载荷接收异常与分包策略 

搜索