为什么叫 T4?因为简写为 4 个 T。
T4() 是微软官方在 VisualStudio 2008 中开始使用的代码生成引擎。在 Visual Studio 中,"T4 文本模板 " 是由一些文本块和控制逻辑组成的混合模板,它可以生成文本文件。 在 Visual C# 或 Visual Basic 中,控制逻辑编写为程序代码的片段。生成的文件可以是任何类型的文本,例如网页、资源文件或任何语言的程序源代码。现在的 VS 中只要与代码生成相关的场景基本上都能找 T4 的身影,比如 MVC 的视图模板,Entity Framwork 的 DataContext 模板等等。
若论灵活性,各种代码生成工具还真不如 T4 模板。
在 VS2013 种默认没有了 T4 模板,取而代之的是文本模板,但是他们的后缀名都是. tt。我们可以通过 NuGet 安装 T4 模板。
安装之后,我们在项目中新建项的时候,在 VS 模板中就多了两项和 T4 模板相关的模板。
当我们在新建的 T4 模板中进行代码编写的时候,默认是没有智能提示的,我们需要再安装一个 T4Editor 的 VS 插件 tangibleT4EditorPlusModellingToolsVS2013.msi。
下载地址:
由于我这里用的是 VS2013,所以按照 13 的插件,安装插件时先关闭 VS,安装完成之后在 T4 模板中编写代码时就有了智能提示了。
关于 T4 模板的详细讲解,大家可以参照一下博客文章:
我这里要说的是,如何在项目中替代其它的代码工具来使用,比如说,自动生成数据库中的 POCO 类。
思路:1、我们要查询中数据库中的表和字段。2、根据数据表名才,将其生成多个 POCO 类文件
开发环境:VS2013
准备工作:添加必须的程序集引用
在自己电脑上面用 everythin 找到 Microsoft.VisualStudio.TextTemplating.Interfaces.10.0.dll,然后添加引用,如果没有,你就网上下载一个。
1、添加一个 T4 模板文件 DbHelper,将其后缀修改为. ttinclude,因为我是将其作为内嵌的 T4 文件,不修改扩展名的话,会将其当成 T4 模板文件进行生成。
View Code
- <#+
- public class DbHelper
- {
- #region GetDbTables
- public static List GetDbTables(string connectionString, string database, string tables = null)
- {
- if (!string.IsNullOrEmpty(tables))
- {
- tables = string.Format(" and obj.name in ('{0}')", tables.Replace(",", "','"));
- }
- #region SQL
- string sql = string.Format(@"SELECT
- obj.name tablename,
- schem.name schemname,
- idx.rows,
- CAST
- (
- CASE
- WHEN (SELECT COUNT(1) FROM sys.indexes WHERE object_id= obj.OBJECT_ID AND is_primary_key=1) >=1 THEN 1
- ELSE 0
- END
- AS BIT) HasPrimaryKey
- from {0}.sys.objects obj
- inner join {0}.dbo.sysindexes idx on obj.object_id=idx.id and idx.indid<=1
- INNER JOIN {0}.sys.schemas schem ON obj.schema_id=schem.schema_id
- where type='U' {1}
- order by obj.name", database, tables);
- #endregion
- DataTable dt = GetDataTable(connectionString, sql);
- return dt.Rows.Cast().Select(row => new DbTable
- {
- TableName = row.Field<string>("tablename"),
- SchemaName = row.Field<string>("schemname"),
- Rows = row.Field<int>("rows"),
- HasPrimaryKey = row.Field<bool>("HasPrimaryKey")
- }).ToList();
- }
- #endregion
- #region GetDbColumns
- public static List GetDbColumns(string connectionString, string database, string tableName, string schema = "dbo")
- {
- #region SQL
- string sql = string.Format(@"
- WITH indexCTE AS
- (
- SELECT
- ic.column_id,
- ic.index_column_id,
- ic.object_id
- FROM {0}.sys.indexes idx
- INNER JOIN {0}.sys.index_columns ic ON idx.index_id = ic.index_id AND idx.object_id = ic.object_id
- WHERE idx.object_id =OBJECT_ID(@tableName) AND idx.is_primary_key=1
- )
- select
- colm.column_id ColumnID,
- CAST(CASE WHEN indexCTE.column_id IS NULL THEN 0 ELSE 1 END AS BIT) IsPrimaryKey,
- colm.name ColumnName,
- systype.name ColumnType,
- colm.is_identity IsIdentity,
- colm.is_nullable IsNullable,
- cast(colm.max_length as int) ByteLength,
- (
- case
- when systype.name='nvarchar' and colm.max_length>0 then colm.max_length/2
- when systype.name='nchar' and colm.max_length>0 then colm.max_length/2
- when systype.name='ntext' and colm.max_length>0 then colm.max_length/2
- else colm.max_length
- end
- ) CharLength,
- cast(colm.precision as int) Precision,
- cast(colm.scale as int) Scale,
- prop.value Remark
- from {0}.sys.columns colm
- inner join {0}.sys.types systype on colm.system_type_id=systype.system_type_id and colm.user_type_id=systype.user_type_id
- left join {0}.sys.extended_properties prop on colm.object_id=prop.major_id and colm.column_id=prop.minor_id
- LEFT JOIN indexCTE ON colm.column_id=indexCTE.column_id AND colm.object_id=indexCTE.object_id
- where colm.object_id=OBJECT_ID(@tableName)
- order by colm.column_id", database);
- #endregion
- SqlParameter param = new SqlParameter("@tableName", SqlDbType.NVarChar, 100) { Value = string.Format("{0}.{1}.{2}", database, schema, tableName) };
- DataTable dt = GetDataTable(connectionString, sql, param);
- return dt.Rows.Cast().Select(row => new DbColumn()
- {
- ColumnID = row.Field<int>("ColumnID"),
- IsPrimaryKey = row.Field<bool>("IsPrimaryKey"),
- ColumnName = row.Field<string>("ColumnName"),
- ColumnType = row.Field<string>("ColumnType"),
- IsIdentity = row.Field<bool>("IsIdentity"),
- IsNullable = row.Field<bool>("IsNullable"),
- ByteLength = row.Field<int>("ByteLength"),
- CharLength = row.Field<int>("CharLength"),
- Scale = row.Field<int>("Scale"),
- Remark = row["Remark"].ToString()
- }).ToList();
- }
- #endregion
- #region GetDataTable
- public static DataTable GetDataTable(string connectionString, string commandText, params SqlParameter[] parms)
- {
- using (SqlConnection connection = new SqlConnection(connectionString))
- {
- SqlCommand command = connection.CreateCommand();
- command.CommandText = commandText;
- command.Parameters.AddRange(parms);
- SqlDataAdapter adapter = new SqlDataAdapter(command);
- DataTable dt = new DataTable();
- adapter.Fill(dt);
- return dt;
- }
- }
- #endregion
- }
- #region DbTable
- /// <summary>
- /// 表结构
- /// </summary>
- public sealed class DbTable
- {
- /// <summary>
- /// 表名称
- /// </summary>
- public string TableName { get; set; }
- /// <summary>
- /// 表的架构
- /// </summary>
- public string SchemaName { get; set; }
- /// <summary>
- /// 表的记录数
- /// </summary>
- public int Rows { get; set; }
- /// <summary>
- /// 是否含有主键
- /// </summary>
- public bool HasPrimaryKey { get; set; }
- }
- #endregion
- #region DbColumn
- /// <summary>
- /// 表字段结构
- /// </summary>
- public sealed class DbColumn
- {
- /// <summary>
- /// 字段ID
- /// </summary>
- public int ColumnID { get; set; }
- /// <summary>
- /// 是否主键
- /// </summary>
- public bool IsPrimaryKey { get; set; }
- /// <summary>
- /// 字段名称
- /// </summary>
- public string ColumnName { get; set; }
- /// <summary>
- /// 字段类型
- /// </summary>
- public string ColumnType { get; set; }
- /// <summary>
- /// 数据库类型对应的C#类型
- /// </summary>
- public string CSharpType
- {
- get
- {
- return SqlServerDbTypeMap.MapCsharpType(ColumnType);
- }
- }
- /// <summary>
- ///
- /// </summary>
- public Type CommonType
- {
- get
- {
- return SqlServerDbTypeMap.MapCommonType(ColumnType);
- }
- }
- /// <summary>
- /// 字节长度
- /// </summary>
- public int ByteLength { get; set; }
- /// <summary>
- /// 字符长度
- /// </summary>
- public int CharLength { get; set; }
- /// <summary>
- /// 小数位
- /// </summary>
- public int Scale { get; set; }
- /// <summary>
- /// 是否自增列
- /// </summary>
- public bool IsIdentity { get; set; }
- /// <summary>
- /// 是否允许空
- /// </summary>
- public bool IsNullable { get; set; }
- /// <summary>
- /// 描述
- /// </summary>
- public string Remark { get; set; }
- }
- #endregion
- #region SqlServerDbTypeMap
- public class SqlServerDbTypeMap
- {
- public static string MapCsharpType(string dbtype)
- {
- if (string.IsNullOrEmpty(dbtype)) return dbtype;
- dbtype = dbtype.ToLower();
- string csharpType = "object";
- switch (dbtype)
- {
- case "bigint": csharpType = "long"; break;
- case "binary": csharpType = "byte[]"; break;
- case "bit": csharpType = "bool"; break;
- case "char": csharpType = "string"; break;
- case "date": csharpType = "DateTime"; break;
- case "datetime": csharpType = "DateTime"; break;
- case "datetime2": csharpType = "DateTime"; break;
- case "datetimeoffset": csharpType = "DateTimeOffset"; break;
- case "decimal": csharpType = "decimal"; break;
- case "float": csharpType = "double"; break;
- case "image": csharpType = "byte[]"; break;
- case "int": csharpType = "int"; break;
- case "money": csharpType = "decimal"; break;
- case "nchar": csharpType = "string"; break;
- case "ntext": csharpType = "string"; break;
- case "numeric": csharpType = "decimal"; break;
- case "nvarchar": csharpType = "string"; break;
- case "real": csharpType = "Single"; break;
- case "smalldatetime": csharpType = "DateTime"; break;
- case "smallint": csharpType = "short"; break;
- case "smallmoney": csharpType = "decimal"; break;
- case "sql_variant": csharpType = "object"; break;
- case "sysname": csharpType = "object"; break;
- case "text": csharpType = "string"; break;
- case "time": csharpType = "TimeSpan"; break;
- case "timestamp": csharpType = "byte[]"; break;
- case "tinyint": csharpType = "byte"; break;
- case "uniqueidentifier": csharpType = "Guid"; break;
- case "varbinary": csharpType = "byte[]"; break;
- case "varchar": csharpType = "string"; break;
- case "xml": csharpType = "string"; break;
- default: csharpType = "object"; break;
- }
- return csharpType;
- }
- public static Type MapCommonType(string dbtype)
- {
- if (string.IsNullOrEmpty(dbtype)) return Type.Missing.GetType();
- dbtype = dbtype.ToLower();
- Type commonType = typeof(object);
- switch (dbtype)
- {
- case "bigint": commonType = typeof(long); break;
- case "binary": commonType = typeof(byte[]); break;
- case "bit": commonType = typeof(bool); break;
- case "char": commonType = typeof(string); break;
- case "date": commonType = typeof(DateTime); break;
- case "datetime": commonType = typeof(DateTime); break;
- case "datetime2": commonType = typeof(DateTime); break;
- case "datetimeoffset": commonType = typeof(DateTimeOffset); break;
- case "decimal": commonType = typeof(decimal); break;
- case "float": commonType = typeof(double); break;
- case "image": commonType = typeof(byte[]); break;
- case "int": commonType = typeof(int); break;
- case "money": commonType = typeof(decimal); break;
- case "nchar": commonType = typeof(string); break;
- case "ntext": commonType = typeof(string); break;
- case "numeric": commonType = typeof(decimal); break;
- case "nvarchar": commonType = typeof(string); break;
- case "real": commonType = typeof(Single); break;
- case "smalldatetime": commonType = typeof(DateTime); break;
- case "smallint": commonType = typeof(short); break;
- case "smallmoney": commonType = typeof(decimal); break;
- case "sql_variant": commonType = typeof(object); break;
- case "sysname": commonType = typeof(object); break;
- case "text": commonType = typeof(string); break;
- case "time": commonType = typeof(TimeSpan); break;
- case "timestamp": commonType = typeof(byte[]); break;
- case "tinyint": commonType = typeof(byte); break;
- case "uniqueidentifier": commonType = typeof(Guid); break;
- case "varbinary": commonType = typeof(byte[]); break;
- case "varchar": commonType = typeof(string); break;
- case "xml": commonType = typeof(string); break;
- default: commonType = typeof(object); break;
- }
- return commonType;
- }
- }
- #endregion
- #>
上面的代码就是查询数据库中的表和字段。
2、同样添加另一个 T4 模板文件,并修改后缀名 Manager.ttinclude
View Code
- <#@ assembly name="System.Data.Linq"
- #><#@ assembly name="EnvDTE"
- #><#@ assembly name="System.Xml"
- #><#@ assembly name="System.Xml.Linq"
- #><#@ import namespace="System.Collections.Generic"
- #><#@ import namespace="System.IO"
- #><#@ import namespace="System.Text"
- #><#@ import namespace="Microsoft.VisualStudio.TextTemplating"
- #><#+
- // https://raw.github.com/damieng/DamienGKit
- // http://damieng.com/blog/2009/11/06/multiple-outputs-from-t4-made-easy-revisited
- // Manager class records the various blocks so it can split them up
- class Manager {
- private class Block {
- public String Name;
- public int Start, Length;
- public bool IncludeInDefault;
- }
- private Block currentBlock;
- private readonly List files = new List();
- private readonly Block footer = new Block();
- private readonly Block header = new Block();
- private readonly ITextTemplatingEngineHost host;
- private readonly StringBuilder template;
- protected readonly List generatedFileNames = new List();
- public static Manager Create(ITextTemplatingEngineHost host, StringBuilder template) {
- return (host is IServiceProvider) ? new VSManager(host, template) : new Manager(host, template);
- }
- public void StartNewFile(String name) {
- if (name == null)
- throw new ArgumentNullException("name");
- CurrentBlock = new Block { Name = name };
- }
- public void StartFooter(bool includeInDefault = true) {
- CurrentBlock = footer;
- footer.IncludeInDefault = includeInDefault;
- }
- public void StartHeader(bool includeInDefault = true) {
- CurrentBlock = header;
- header.IncludeInDefault = includeInDefault;
- }
- public void EndBlock() {
- if (CurrentBlock == null)
- return;
- CurrentBlock.Length = template.Length - CurrentBlock.Start;
- if (CurrentBlock != header && CurrentBlock != footer)
- files.Add(CurrentBlock);
- currentBlock = null;
- }
- public virtual void Process(bool split, bool sync = true) {
- if (split) {
- EndBlock();
- String headerText = template.ToString(header.Start, header.Length);
- String footerText = template.ToString(footer.Start, footer.Length);
- String outputPath = Path.GetDirectoryName("host.TemplateFile");
- files.Reverse();
- if (!footer.IncludeInDefault)
- template.Remove(footer.Start, footer.Length);
- foreach(Block block in files) {
- String fileName = Path.Combine(outputPath, block.Name);
- String content = headerText + template.ToString(block.Start, block.Length) + footerText;
- generatedFileNames.Add(fileName);
- CreateFile(fileName, content);
- template.Remove(block.Start, block.Length);
- }
- if (!header.IncludeInDefault)
- template.Remove(header.Start, header.Length);
- }
- }
- protected virtual void CreateFile(String fileName, String content) {
- if (IsFileContentDifferent(fileName, content))
- File.WriteAllText(fileName, content);
- }
- public virtual String GetCustomToolNamespace(String fileName) {
- return null;
- }
- public virtual String DefaultProjectNamespace {
- get { return null; }
- }
- protected bool IsFileContentDifferent(String fileName, String newContent) {
- return !(File.Exists(fileName) && File.ReadAllText(fileName) == newContent);
- }
- private Manager(ITextTemplatingEngineHost host, StringBuilder template) {
- this.host = host;
- this.template = template;
- }
- private Block CurrentBlock {
- get { return currentBlock; }
- set {
- if (CurrentBlock != null)
- EndBlock();
- if (value != null)
- value.Start = template.Length;
- currentBlock = value;
- }
- }
- private class VSManager: Manager {
- private readonly EnvDTE.ProjectItem templateProjectItem;
- private readonly EnvDTE.DTE dte;
- private readonly Action checkOutAction;
- private readonly Action> projectSyncAction;
- public override String DefaultProjectNamespace {
- get {
- return templateProjectItem.ContainingProject.Properties.Item("DefaultNamespace").Value.ToString();
- }
- }
- public override String GetCustomToolNamespace(string fileName) {
- return dte.Solution.FindProjectItem(fileName).Properties.Item("CustomToolNamespace").Value.ToString();
- }
- public override void Process(bool split, bool sync) {
- if (templateProjectItem.ProjectItems == null)
- return;
- base.Process(split, sync);
- if (sync)
- projectSyncAction.EndInvoke(projectSyncAction.BeginInvoke(generatedFileNames, null, null));
- }
- protected override void CreateFile(String fileName, String content) {
- if (IsFileContentDifferent(fileName, content)) {
- CheckoutFileIfRequired(fileName);
- File.WriteAllText(fileName, content);
- }
- }
- internal VSManager(ITextTemplatingEngineHost host, StringBuilder template)
- : base(host, template) {
- var hostServiceProvider = (IServiceProvider)host;
- if (hostServiceProvider == null)
- throw new ArgumentNullException("Could not obtain IServiceProvider");
- dte = (EnvDTE.DTE) hostServiceProvider.GetService(typeof(EnvDTE.DTE));
- if (dte == null)
- throw new ArgumentNullException("Could not obtain DTE from host");
- templateProjectItem = dte.Solution.FindProjectItem(host.TemplateFile);
- checkOutAction = fileName => dte.SourceControl.CheckOutItem(fileName);
- projectSyncAction = keepFileNames => ProjectSync(templateProjectItem, keepFileNames);
- }
- private static void ProjectSync(EnvDTE.ProjectItem templateProjectItem, List keepFileNames) {
- var keepFileNameSet = new HashSet(keepFileNames);
- var projectFiles = new Dictionary();
- var originalFilePrefix = Path.GetFileNameWithoutExtension(templateProjectItem.FileNames[0]) + ".";
- foreach (EnvDTE.ProjectItem projectItem in templateProjectItem.ProjectItems)
- projectFiles.Add(projectItem.FileNames[0], projectItem);
- // Remove unused items from the project
- foreach (var pair in projectFiles)
- if (!keepFileNames.Contains(pair.Key) && !(Path.GetFileNameWithoutExtension(pair.Key) + ".").StartsWith(originalFilePrefix))
- pair.Value.Delete();
- // Add missing files to the project
- foreach(String fileName in keepFileNameSet)
- if (!projectFiles.ContainsKey(fileName))
- templateProjectItem.ProjectItems.AddFromFile(fileName);
- }
- private void CheckoutFileIfRequired(String fileName) {
- var sc = dte.SourceControl;
- if (sc != null && sc.IsItemUnderSCC(fileName) && !sc.IsItemCheckedOut(fileName))
- checkOutAction.EndInvoke(checkOutAction.BeginInvoke(fileName, null, null));
- }
- }
- } #>
上面的代码是用来生成多文件的。
3、新建 T4 模板文件 PocoManager.tt,然后引入上面两个 ttinclude 文件。
View Code
- <#@ template debug="false" hostspecific="true" language="C#" #>
- <#@ assembly name="System.Data" #>
- <#@ assembly name="System.Data.DataSetExtensions.dll" #>
- <#@ assembly name="System.xml" #>
- <#@ import namespace="System" #>
- <#@ import namespace="System.Xml" #>
- <#@ import namespace="System.Collections.Generic" #>
- <#@ import namespace="System.Data" #>
- <#@ import namespace="System.Data.SqlClient" #>
- <#@ import namespace="System.IO" #>
- <#@ assembly name="System.Core" #>
- <#@ import namespace="System.Linq" #>
- <#@include file="$(ProjectDir)Models\DbHelper.ttinclude" #>
- <#@include file="$(ProjectDir)Models\Manager.ttinclude" #>
- <# var manager=M anager.Create(Host, GenerationEnvironment); #>
- <# manager.StartHeader(); #>
- using System; using System.Collections.Generic; namespace My.Model {
- <# manager.EndBlock(); #>
- <# foreach (DbTable db in DbHelper.GetDbTables(config.ConnectionString,
- config.DbDatabase)) { string tb_name=db.TableName; manager.StartNewFile(tb_name+
- ".cs");#>
- ///
- <summary>
- /// 实体-
- <#=tb_name#>
- ///
- </summary>
- public partial class
- <#=tb_name#>
- {
- <# foreach(DbColumn column in DbHelper.GetDbColumns(config.ConnectionString,
- config.DbDatabase, tb_name)){#>
- ///
- <summary>
- ///
- <#=column.Remark#>
- ///
- </summary>
- public
- <#=c olumn.CSharpType#>
- <# if(column.CommonType.IsValueType && column.IsNullable){#>
- ?
- <#}#>
- <#=column.ColumnName#>
- { get; set; }
- <#}#>
- }
- <#//manager.EndBlock(); } //conn.Close(); #>
- <# manager.StartFooter(); #>
- }
- <# manager.EndBlock(); #>
- <# manager.Process(true); #>
- <#+ public class config { public static readonly string ConnectionString="Data Source=(local);Integrated Security=true;Initial Catalog=CarSYS;"
- ; public static readonly string DbDatabase="CarSYS" ; } #>
按 Ctrl+S 生成的代码如下:
View Code
- using System;
- using System.Collections.Generic;
- namespace My.Model {
- /// <summary>
- /// 实体-Brand
- /// </summary>
- public partial class Brand {
- /// <summary>
- /// 编号
- /// </summary>
- public int BrandId {
- get;
- set;
- }
- /// <summary>
- ///
- /// </summary>
- public string BrandName {
- get;
- set;
- }
- }
- /// <summary>
- /// 实体-Car
- /// </summary>
- public partial class Car {
- /// <summary>
- /// 编号
- /// </summary>
- public int CarId {
- get;
- set;
- }
- /// <summary>
- /// 车名称
- /// </summary>
- public string CarName {
- get;
- set;
- }
- /// <summary>
- /// 品牌编号
- /// </summary>
- public int ? BrandId {
- get;
- set;
- }
- /// <summary>
- /// 实体图的文件名
- /// </summary>
- public string Picture {
- get;
- set;
- }
- /// <summary>
- /// 官方价
- /// </summary>
- public decimal OfficialPrice {
- get;
- set;
- }
- /// <summary>
- /// 点击率
- /// </summary>
- public int ? Click {
- get;
- set;
- }
- }
- /// <summary>
- /// 实体-Product
- /// </summary>
- public partial class Product {
- /// <summary>
- ///
- /// </summary>
- public Guid Id {
- get;
- set;
- }
- /// <summary>
- ///
- /// </summary>
- public string NAME {
- get;
- set;
- }
- /// <summary>
- ///
- /// </summary>
- public decimal Price {
- get;
- set;
- }
- }
- }
操作方式一种的步骤 2,然后新建 T4 模板 Manager.tt,引入 Manager.ttinclude
View Code
- <#@ template debug="false" hostspecific="true" language="C#" #>
- <#@ assembly name="System.Data" #>
- <#@ assembly name="System.xml" #>
- <#@ import namespace="System.Collections.Generic" #>
- <#@ import namespace="System.Data.SqlClient" #>
- <#@ import namespace="System.Data" #>
- <#@ assembly name="System.Core" #>
- <#@ import namespace="System.Linq" #>
- <#@include file="$(ProjectDir)Models\Manager.ttinclude"#>
- <# var manager = Manager.Create(Host, GenerationEnvironment); #>
- <# manager.StartHeader(); #>
- using System;
- using System.Collections.Generic;
- namespace My.Model
- {
- <# manager.EndBlock(); #>
- <#
- string connectionString= "server=localhost;database=CarSYS;uid=sa;pwd=1127;";
- SqlConnection conn = new SqlConnection(connectionString);
- conn.Open();
- string selectQuery ="SET FMTONLY ON; select * from @tableName; SET FMTONLY OFF;";
- SqlCommand command = new SqlCommand(selectQuery,conn);
- SqlDataAdapter ad = new SqlDataAdapter(command);
- System.Data.DataSet ds = new DataSet();
- System.Data.DataTable schema = conn.GetSchema("Tables");
- foreach(System.Data.DataRow row in schema.Rows)
- {
- ds.Tables.Clear();
- string tb_name =row["TABLE_NAME"].ToString().Replace(" ","_");
- string tb_type=row["TABLE_TYPE"].ToString();
- if(tb_type!="BASE TABLE")
- {
- continue;
- }
- command.CommandText = selectQuery.Replace("@tableName","["+row["TABLE_NAME"].ToString()+"]");
- ad.FillSchema(ds,SchemaType.Mapped,tb_name);
- manager.StartNewFile(tb_name+".cs");
- #>
- /// <summary>
- /// 实体-<#=tb_name#>
- /// </summary>
- public partial class <#=tb_name#>
- {
- <#
- //PushIndent(" ");
- foreach (DataColumn dc in ds.Tables[0].Columns)
- {
- string dataTypeName=dc.DataType.Name=="Byte[]"?"DateTime":dc.DataType.Name;
- #>
- /// <summary>
- /// <#=dc#>
- /// </summary>
- <#
- WriteLine("public " + dataTypeName + (dc.AllowDBNull && dataTypeName.ToLower() != "string" ? "? ": " ") + dc.ColumnName + " { get; set; }");
- }
- PopIndent();
- #>
- }
- <#
- manager.EndBlock();
- }
- conn.Close();
- #>
- <# manager.StartFooter(); #>
- }
- <# manager.EndBlock(); #>
- <# manager.Process(true); #>
按 Ctrl+S 生成的代码如下:
View Code
- using System;
- using System.Collections.Generic;
- namespace My.Model {
- /// <summary>
- /// 实体-Brand
- /// </summary>
- public partial class Brand {
- /// <summary>
- /// BrandId
- /// </summary>
- public Int32 BrandId {
- get;
- set;
- }
- /// <summary>
- /// BrandName
- /// </summary>
- public String BrandName {
- get;
- set;
- }
- }
- /// <summary>
- /// 实体-Car
- /// </summary>
- public partial class Car {
- /// <summary>
- /// CarId
- /// </summary>
- public Int32 CarId {
- get;
- set;
- }
- /// <summary>
- /// CarName
- /// </summary>
- public String CarName {
- get;
- set;
- }
- /// <summary>
- /// BrandId
- /// </summary>
- public Int32 ? BrandId {
- get;
- set;
- }
- /// <summary>
- /// Picture
- /// </summary>
- public String Picture {
- get;
- set;
- }
- /// <summary>
- /// OfficialPrice
- /// </summary>
- public Decimal OfficialPrice {
- get;
- set;
- }
- /// <summary>
- /// Click
- /// </summary>
- public Int32 ? Click {
- get;
- set;
- }
- }
- /// <summary>
- /// 实体-Product
- /// </summary>
- public partial class Product {
- /// <summary>
- /// Id
- /// </summary>
- public Guid Id {
- get;
- set;
- }
- /// <summary>
- /// NAME
- /// </summary>
- public String NAME {
- get;
- set;
- }
- /// <summary>
- /// Price
- /// </summary>
- public Decimal Price {
- get;
- set;
- }
- }
- }
数据库 CarSYS 的脚本下载
来源: http://www.cnblogs.com/jiekzou/p/6410719.html