这是一个妥妥的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实体类的更多相关文章

  1. 使用T4模板动态生成邮件内容并储存到任意位置

    一.基础概念介绍 T4模板是扩展名为 .tt 的文本文件. 他分为设计时模板 和运行时模板.主要区别在于在vs中右键点击文件,打开“属性”,在“自定义工具”一栏中的值分别如下: 设计时模板: Text ...

  2. 讨论一下hibernate如何动态注册一个动态生成的实体类

    如何动态生成实体类请参考这篇博文:http://www.cnblogs.com/anai/p/4269858.html 下面说说得到实体类后,如何能使用hibernate的接口来进行数据访问. 我们都 ...

  3. T4模版自动生成MSSQL实体类

    在Model层建立ModelAuto.ttinclude文件 <#@ assembly name="System.Core"#> <#@ assembly nam ...

  4. 使用T4模板同时生成多个类文件

    代码: <#@ template language="C#" debug="false" hostspecific="true"#&g ...

  5. T4 模板自动生成带注释的实体类文件

    T4 模板自动生成带注释的实体类文件 - 只需要一个 SqlSugar.dll 生成实体就是这么简单,只要建一个T4文件和 文件夹里面放一个DLL. 使用T4模板教程 步骤1 创建T4模板 如果你没有 ...

  6. T4教程2 T4模版引擎之生成数据库实体类

    T4模版引擎之生成数据库实体类   在通过T4模版引擎之基础入门 对T4有了初步印象后,我们开始实战篇.T4模板引擎可以当做一个代码生成器,代码生成器的职责当然是用来生成代码(这不是废话吗).而这其中 ...

  7. PetaPoco T4模板修改生成实体

    PetaPoco T4 模板生成的实体类全部包含再一个.CS文件中.通过修改PetaPoco的T4模板,生成单文件实体. 1.生成单CS文件模板: SigleFile.ttinclude <#@ ...

  8. [转]T4模版引擎之生成数据库实体类

    本文转自:http://www.cnblogs.com/lzrabbit/archive/2012/07/18/2597953.html 在通过T4模版引擎之基础入门 对T4有了初步印象后,我们开始实 ...

  9. T4模版引擎之生成数据库实体类

    在通过T4模版引擎之基础入门 对T4有了初步印象后,我们开始实战篇.T4模板引擎可以当做一个代码生成器,代码生成器的职责当然是用来生成代码(这不是废话吗).而这其中我们使用的最普遍的是根据数据库生成实 ...

随机推荐

  1. XML fragments parsed from previous mappers already contains value for

    1. ssm项目报错: WARN  [main]  DefaultListableBeanFactory:1479-- Bean creation exception on FactoryBean t ...

  2. MYSQL学习(二) --MYSQL框架

    MYSQL架构理解 通过对MYSQL重要的几个属性的理解,建立一个基本的MYSQL的知识框架.后续再补充完善. 一.MYSQL架构 这里给的架构描述,是很宏观的架构.有助于建立对MYSQL整体理解. ...

  3. ubutun 服务器配置jupyter notebook

    由于能力有限,学习机器学习时候发现,自己的电脑带不起来,所以想起了服务器,选择的是阿里的ubutun服务器,所以希望能够 使用jupyter notebook,看到网上一大片,配置和好久,才成功,在这 ...

  4. tcp timewait 问题 转载

    TIME WAIT 带来的问题 先引用一个名言: The TIME_WAIT state is our friend and is there to help us (i.e., to let old ...

  5. jdk1.7中hashmap扩容时不会产生死循环

    在扩容时 transfer( ) 方法中 newTable 新数组 局部变量 table 旧数组 全局变量 当第一个链表进行while循环时 执行到 e.next = newTable[i]; 时 n ...

  6. linux centos 6.x 装机后基本优化

    1.关闭SELinux /etc/selinux/config配置文件内替换 se -i 's/SELINUX=enforcing/SELINUX=disabled/g'需要重启grep SELINU ...

  7. Java 开发之 Lombok 必知必会

    转载链接地址:https://juejin.im/post/5cf3edf7e51d454f71439c79 1. 前言 在目前众多编程语言中,Java 语言的表现还是抢眼,不论是企业级服务端开发,还 ...

  8. CTF-WEB-XTCTF-Web_php_unserialize

    题目来源 XTCTF-Web_php_unserialize 题目考点:PHP代码审计.PHP正则.PHP序列化与反序列化 解题思路 题目源码 <?php class Demo { privat ...

  9. php获取字符串长度

    function len($zfc){ $arr = []; $len = mb_strlen($zfc); for ($i = 0; $i < $len; $i++) { array_push ...

  10. OxyPlot组件的基本使用

    在制作上位机的时候,很多时候需要使用到监控绘图界面,使用来绘制曲线的组件有很多,GDI+.char.OxyPlot等等,这篇文章用来介绍OxyPlot组件的基本应用,在本文中主要是利用随心数生成函数结 ...