使用T4模板动态生成NPoco实体类
这是一个妥妥的NPoco类,这是我们在工作开发中,手动去写这个实体类,属实非常心累,字段少无所谓一次两次,数量多了,字段多了,就心态裂开
今天分享一下如何使用T4模板生成实体类
using System;
using NPoco;
using System.ComponentModel.DataAnnotations;
namespace Electric.Domain.Entities
{
/// <summary>
/// Represents a T_RepairParts.
/// NOTE: 这个类是从T4模板生成的——你不应该手动修改它。
/// </summary>
[MetadataType(typeof(T_RepairPartsMetadata))]
[PrimaryKey("ID")]
[TableName("[dbo].[T_RepairParts]")]
public class T_RepairParts
{
#region ResultColumn
#endregion
#region Ignore
#endregion
private class T_RepairPartsMetadata{
[StringLength(4, ErrorMessage = "{0}不能超过4个字符!")]
[Required(ErrorMessage = "请填写{0}!")]
[Display(Name = "")]
[Column("ID")]
public int Id { get; set; }
[StringLength(50, ErrorMessage = "{0}不能超过50个字符!")]
[Required(ErrorMessage = "请填写{0}!")]
[Display(Name = "配件名称")]
[Column("PartsName")]
public string PartsName { get; set; }
[StringLength(100, ErrorMessage = "{0}不能超过100个字符!")]
[Required(ErrorMessage = "请填写{0}!")]
[Display(Name = "绑定品牌")]
[Column("RelationBrands")]
public string RelationBrands { get; set; }
[StringLength(100, ErrorMessage = "{0}不能超过100个字符!")]
[Required(ErrorMessage = "请填写{0}!")]
[Display(Name = "关联维修")]
[Column("RelationMaintainers")]
public string RelationMaintainers { get; set; }
[StringLength(100, ErrorMessage = "{0}不能超过100个字符!")]
[Required(ErrorMessage = "请填写{0}!")]
[Display(Name = "关联车系")]
[Column("RelationVehicleSeries")]
public string RelationVehicleSeries { get; set; }
[StringLength(-1, ErrorMessage = "{0}不能超过-1个字符!")]
[Required(ErrorMessage = "请填写{0}!")]
[Display(Name = "")]
[Column("EditorContent")]
public string EditorContent { get; set; }
[StringLength(-1, ErrorMessage = "{0}不能超过-1个字符!")]
[Required(ErrorMessage = "请填写{0}!")]
[Display(Name = "")]
[Column("BasicDetails")]
public string BasicDetails { get; set; }
[StringLength(8, ErrorMessage = "{0}不能超过8个字符!")]
[Required(ErrorMessage = "请填写{0}!")]
[Display(Name = "创建时间")]
[Column("CreateTime")]
public DateTime CreateTime { get; set; }
[Display(Name = "修改时间")]
[Column("Updatetime")]
public DateTime? Updatetime { get; set; }
[StringLength(1, ErrorMessage = "{0}不能超过1个字符!")]
[Required(ErrorMessage = "请填写{0}!")]
[Display(Name = "是否删除")]
[Column("IsDel")]
public bool IsDel { get; set; }
[StringLength(200, ErrorMessage = "{0}不能超过200个字符!")]
[Required(ErrorMessage = "请填写{0}!")]
[Display(Name = "配件标签")]
[Column("Tips")]
public string Tips { get; set; }
[StringLength(9, ErrorMessage = "{0}不能超过9个字符!")]
[Required(ErrorMessage = "请填写{0}!")]
[Display(Name = "人工价")]
[Column("LaborPrice")]
public decimal LaborPrice { get; set; }
[StringLength(9, ErrorMessage = "{0}不能超过9个字符!")]
[Required(ErrorMessage = "请填写{0}!")]
[Display(Name = "配件价")]
[Column("PartsPrice")]
public decimal PartsPrice { get; set; }
[StringLength(9, ErrorMessage = "{0}不能超过9个字符!")]
[Required(ErrorMessage = "请填写{0}!")]
[Display(Name = "门店市场价格")]
[Column("StorePrice")]
public decimal StorePrice { get; set; }
}
}
}
模板是搬运国外一个大神博客内的代码,下面换个模板是我改后增强的
支持生成字段注释,支持生成字段可空,支持生成字段长度,我并且按照我自己的项目类结构重新弄了一下,原版的T4代码我也分享出来,可以看看
帮助文章: https://www.davidhaney.io/automatically-generate-pocos-from-db-with-t4/
我改后的-T4模板代码
<#@ template language="C#" hostspecific="true" debug="True" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="System.Data" #>
<#@ assembly name="System.Xml" #>
<#@ assembly name="System.Configuration" #>
<#@ assembly name="Microsoft.SqlServer.Smo" #>
<#@ assembly name="Microsoft.SqlServer.ConnectionInfo" #>
<#@ assembly name="Microsoft.SqlServer.Management.Sdk.Sfc" #>
<#@ import namespace="System" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="Microsoft.SqlServer.Management.Smo" #>
<#@ import namespace="Microsoft.VisualStudio.TextTemplating" #>
<#@ import namespace="System.Configuration" #>
<#@ import namespace="System.Data.SqlClient" #>
<#
var configurationFileMap = new ExeConfigurationFileMap();
configurationFileMap.ExeConfigFilename = this.Host.ResolvePath("App.config");
var config = ConfigurationManager.OpenMappedExeConfiguration(configurationFileMap, ConfigurationUserLevel.None);
//**********************************************************************************************
// This T4 generates POCOs from the specified DB and saves them to the specified folder which
// is relative to the template's location. One file per table/POCO.
//**********************************************************************************************
//****************************
// DEFINE YOUR VARIABLES HERE
//****************************
// The SQL server name or IP
string sqlServer = config.AppSettings.Settings["sqlServer"].Value;
// The SQL username
string sqlLogin = config.AppSettings.Settings["sqlLogin"].Value;
// The SQL password
string sqlPassword = config.AppSettings.Settings["sqlPassword"].Value;
// The SQL database to generate the POCOs for
string sqlDatabase = config.AppSettings.Settings["sqlDatabase"].Value;
// The namespace to apply to the generated classes
string classNamespace = config.AppSettings.Settings["classNamespace"].Value;
// The destination folder for the generated classes, relative to this file's location.
string destinationFolder = config.AppSettings.Settings["destinationFolder"].Value;
// Loop over each table and create a class file!
Server server = new Server(sqlServer);
server.ConnectionContext.LoginSecure = false;
server.ConnectionContext.Login = sqlLogin;
server.ConnectionContext.Password = sqlPassword;
server.ConnectionContext.Connect();
foreach (Table table in server.Databases[sqlDatabase].Tables)
{
// Skip sys tables
if (table.Name.StartsWith("sys"))
{
continue;
}
string nombreTabla="["+ table.Schema +"].["+table.Name+"]";
//search PK
String namePK="";
foreach (Column col in table.Columns)
{
if(col.InPrimaryKey){
namePK=col.Name;
continue;
}
}
String nameSchema="";
if(!table.Schema.Equals("dbo")){
nameSchema = "."+table.Schema;
}
#>
using System;
using NPoco;
using System.ComponentModel.DataAnnotations;
namespace <#= classNamespace #><#= nameSchema #>
{
/// <summary>
/// Represents a <#= table.Name #>.
/// NOTE: 这个类是从T4模板生成的——你不应该手动修改它。
/// </summary>
[MetadataType(typeof(<#=table.Name + "Metadata"#>))]
[PrimaryKey("<#= namePK #>")]
[TableName("<#= nombreTabla #>")]
public class <#= table.Name #>
{
#region ResultColumn
#endregion
#region Ignore
#endregion
private class <#=table.Name + "Metadata"#>{
<#
// Keep count so we don't whitespace the last property/column
int columnCount = table.Columns.Count;
int i = 0;
// Iterate all columns
foreach (Column col in table.Columns)
{
i++;
string propertyType = GetNetDataType(col.DataType.Name);
// If we can't map it, skip it
if (string.IsNullOrWhiteSpace(propertyType))
{
// Skip
continue;
}
string strLength = string.Empty;
string remark = GetRemark(col.Name,nombreTabla,config.AppSettings);
string strNullable = string.Empty;
// Handle nullable columns by making the type nullable
if (col.Nullable && propertyType != "string")
{
propertyType += "?";
}else{
strLength = "[StringLength(" + col.DataType.MaximumLength +", ErrorMessage = \"{0}不能超过"+col.DataType.MaximumLength+"个字符!\")]";
}
if (!col.Nullable)
{
strNullable = "[Required(ErrorMessage = \"请填写{0}!\")]";
}
String nameColumn="Id";
String nameColumnNPoco=col.Name;
if(!col.InPrimaryKey){
nameColumn=FirstCharToUpper(col.Name);
}
#>
<#=strLength#>
<#=strNullable#>
[Display(Name = "<#=remark#>")]
[Column("<#= nameColumnNPoco #>")]
public <#= propertyType #> <#= nameColumn #> { get; set; }
<#
// Do we insert the space?
if (i != columnCount)
{
#>
<#
}
#>
<#
}
#>
}
}
}
<#
// Write new POCO class to its own file
SaveOutput(table.Name + ".cs", destinationFolder);
}
#>
<#+
public static string GetNetDataType(string sqlDataTypeName)
{
switch (sqlDataTypeName.ToLower())
{
case "bigint":
return "Int64";
case "binary":
case "image":
case "varbinary":
return "byte[]";
case "bit":
return "bool";
case "char":
return "char";
case "datetime":
case "smalldatetime":
return "DateTime";
case "decimal":
case "money":
case "numeric":
return "decimal";
case "float":
return "double";
case "int":
return "int";
case "nchar":
case "nvarchar":
case "text":
case "varchar":
case "xml":
return "string";
case "real":
return "single";
case "smallint":
return "Int16";
case "tinyint":
return "byte";
case "uniqueidentifier":
return "Guid";
default:
return null;
}
}
//码农disco修改版,支持字段注释
public static string GetRemark(string name,string table,AppSettingsSection config)
{
string result = string.Empty;
if (table == "[dbo].[T_RepairParts]" && name!="ID")
{
}
string sqlServer = config.Settings["sqlServer"].Value;
string sqlLogin = config.Settings["sqlLogin"].Value;
string sqlPassword = config.Settings["sqlPassword"].Value;
string sqlDatabase = config.Settings["sqlDatabase"].Value;
string connString = "Server="+ sqlServer +";DataBase="+sqlDatabase+";Uid="+sqlLogin+";Pwd="+sqlPassword;
SqlConnection conn = new SqlConnection(connString);
string sql = string.Format(@" USE electric2014
SELECT
A.name AS table_name,
B.name AS column_name,
C.value AS column_description
FROM sys.tables A
INNER JOIN sys.columns B ON B.object_id = A.object_id
LEFT JOIN sys.extended_properties C ON C.major_id = B.object_id AND C.minor_id = B.column_id
WHERE A.name = '{0}' AND B.name = '{1}' ",table.Replace("dbo","").Replace("[","").Replace("]","").Replace(".",""),name);
SqlCommand cmd = new SqlCommand(sql, conn);
conn.Open();
SqlDataReader dr = cmd.ExecuteReader();
while(dr.Read())
{
result = dr["column_description"].ToString();
}
conn.Close();
return result;
}
public static string FirstCharToUpper(string input)
{
if (String.IsNullOrEmpty(input))
throw new ArgumentException("ARGH!");
return input.First().ToString().ToUpper() + input.Substring(1);
}
void SaveOutput(string outputFileName, string destinationFolder)
{
// Write to destination folder
string templateDirectory = Path.Combine(Path.GetDirectoryName(Host.TemplateFile), destinationFolder);
string outputFilePath = Path.Combine(templateDirectory, outputFileName);
File.Delete(outputFilePath);
File.WriteAllText(outputFilePath, this.GenerationEnvironment.ToString());
// Flush generation
this.GenerationEnvironment.Remove(0, this.GenerationEnvironment.Length);
}
#>

所有表生成的类都会写到Export内,这下美滋滋了!
项目源代码下载:github
代码最好拉取Git上的,因为博客的这个代码,可能后面不会再更新了
使用T4模板动态生成NPoco实体类的更多相关文章
- 使用T4模板动态生成邮件内容并储存到任意位置
一.基础概念介绍 T4模板是扩展名为 .tt 的文本文件. 他分为设计时模板 和运行时模板.主要区别在于在vs中右键点击文件,打开“属性”,在“自定义工具”一栏中的值分别如下: 设计时模板: Text ...
- 讨论一下hibernate如何动态注册一个动态生成的实体类
如何动态生成实体类请参考这篇博文:http://www.cnblogs.com/anai/p/4269858.html 下面说说得到实体类后,如何能使用hibernate的接口来进行数据访问. 我们都 ...
- T4模版自动生成MSSQL实体类
在Model层建立ModelAuto.ttinclude文件 <#@ assembly name="System.Core"#> <#@ assembly nam ...
- 使用T4模板同时生成多个类文件
代码: <#@ template language="C#" debug="false" hostspecific="true"#&g ...
- T4 模板自动生成带注释的实体类文件
T4 模板自动生成带注释的实体类文件 - 只需要一个 SqlSugar.dll 生成实体就是这么简单,只要建一个T4文件和 文件夹里面放一个DLL. 使用T4模板教程 步骤1 创建T4模板 如果你没有 ...
- T4教程2 T4模版引擎之生成数据库实体类
T4模版引擎之生成数据库实体类 在通过T4模版引擎之基础入门 对T4有了初步印象后,我们开始实战篇.T4模板引擎可以当做一个代码生成器,代码生成器的职责当然是用来生成代码(这不是废话吗).而这其中 ...
- PetaPoco T4模板修改生成实体
PetaPoco T4 模板生成的实体类全部包含再一个.CS文件中.通过修改PetaPoco的T4模板,生成单文件实体. 1.生成单CS文件模板: SigleFile.ttinclude <#@ ...
- [转]T4模版引擎之生成数据库实体类
本文转自:http://www.cnblogs.com/lzrabbit/archive/2012/07/18/2597953.html 在通过T4模版引擎之基础入门 对T4有了初步印象后,我们开始实 ...
- T4模版引擎之生成数据库实体类
在通过T4模版引擎之基础入门 对T4有了初步印象后,我们开始实战篇.T4模板引擎可以当做一个代码生成器,代码生成器的职责当然是用来生成代码(这不是废话吗).而这其中我们使用的最普遍的是根据数据库生成实 ...
随机推荐
- c语言: 错误:只允许在 C99 模式下使用‘for’循环初始化声明 用gcc编译出现
在gcc编译中如果使用 for(int i=0;i<n;++i){}会提示错误 错误:只允许在 C99 模式下使用'for'循环初始化声明 用gcc编译出现 就是说你的你的c编译器不是c99标准 ...
- CSS z-index应用靠近用户的框
1.z-index (1)z轴.数值越大,越靠近你 (2)只能作用于定位过的标签元素 应用示例 <!DOCTYPE html> <html lang="zh-CN" ...
- 快速安装jumpserver开源堡垒机
一 安装centos 7.X操作系统 二.选择极速安装(注意配置需要是4G2核) https://jumpserver.readthedocs.io/zh/master/install/setup_b ...
- 好学易懂 从零开始的插头DP(一)
好学易懂 从零开始的插头DP(一) 写在前面 这是一篇,以蒟蒻视角展开的梳理总结.更改了一些顺序,变化了一些细节.方便蒟蒻学习理解(起码本蒟蒻是这样).大佬们可以直接看其它大佬的博客,可以学的更快. ...
- java中高级面试利器(boot,cloud,vue前后端提升)
https://github.com/Snailclimb/JavaGuide Java知识大全(面试) https://github.com/doocs/advanced-java Java工 ...
- 一次看完28个关于ES的性能调优技巧,很赞,值得收藏!
因为总是看到很多同学在说Elasticsearch性能不够好.集群不够稳定,询问关于Elasticsearch的调优,但是每次都是一个个点的单独讲,很多时候都是case by case的解答,本文简单 ...
- 标准库之collections
collections 模块----Python标准库,是数据结构常用模块 常用类型有: 计数器(Counter) dict的子类,计算可hash的对象: 双端队列(deque) 类似于list ...
- Mac下载工具folx如何下载常用的软件
最近,多档综艺节目都开展得如火如荼,比如<中国新说唱>.<这就是街舞>等深受年轻人喜欢的综艺节目.虽然手机端也可观看,但可以的话,当然是使用电脑屏幕观看节目比较过瘾. 接下来, ...
- 如何将多个网页合并成一个PDF文件
pdfFactory是一款PDF虚拟打印软件,但与其他虚拟打印机软件不同的是,它使用起来更加简单高效.由于无需Acrobat就能生成Adobe PDF文件,它可以帮助用户在系统没有连接打印机的情况下, ...
- FL Studio水果音乐制作入门教程
"没有早期音乐教育,干什么事我都会一事无成".这并非某位音乐家精心熬制的心灵鸡汤,而是出自物理学家爱因斯坦之口,朋友们没有看错,就是那个被称为二十世纪伟大科学家的爱因斯坦,所以,别 ...