您的位置:时时app平台注册网站 > 编程知识 > c# 利用t4模板,自动生成Model类【时时app平台注册

c# 利用t4模板,自动生成Model类【时时app平台注册

2019-11-21 02:22

时时app平台注册网站 1时时app平台注册网站 2

作品中的源代码在本次下载

 

1.T4语法神速入门

2.T4模板依照DB生成实体类

3.NFine框架的T4模板

t4文件保留后,会自动生成类文件

3.oracle

询问当前客商具备的表。

SELECT TABLE_NAME FROM USER_TABLES;

根据表名查询表结构数据

SELECT A.column_name    字段名,                                                                                      
A.data_type      数据类型,
A.data_length    长度,
A.data_precision 整数位,
A.Data_Scale     小数位,
A.nullable       允许空值,
A.Data_default   缺省值,
B.comments       备注,
A.TABLE_NAME     表名
FROM user_tab_columns A, user_col_comments B
WHERE a.COLUMN_NAME = b.column_name
AND A.Table_Name = B.Table_Name
AND A.Table_Name = 'AFFIXINFO'

 ModelAuto.ttinclude来源与网络,作用是生成一个三个独门的类公事,即xx.cs文件。

时时app平台注册网站 3时时app平台注册网站 4

<#@ assembly name="System.Core"#>
<#@ assembly name="EnvDTE"#>
<#@ import namespace="System.Collections.Generic"#>
<#@ import namespace="System.IO"#>
<#@ import namespace="System.Text"#>
<#@ import namespace="Microsoft.VisualStudio.TextTemplating"#>

<# 

class Manager
{
    public struct Block {
        public String Name;
        public int Start, Length;
    }

    public List<Block> blocks = new List<Block>();
    public Block currentBlock;
    public Block footerBlock = new Block();
    public Block headerBlock = new Block();
    public ITextTemplatingEngineHost host;
    public ManagementStrategy strategy;
    public StringBuilder template;
    public String OutputPath { get; set; }

    public Manager(ITextTemplatingEngineHost host, StringBuilder template, bool commonHeader) {
        this.host = host;
        this.template = template;
        OutputPath = String.Empty;
        strategy = ManagementStrategy.Create(host);
    }

    public void StartBlock(String name) {
        currentBlock = new Block { Name = name, Start = template.Length };
    }

    public void StartFooter() {
        footerBlock.Start = template.Length;
    }

    public void EndFooter() {
        footerBlock.Length = template.Length - footerBlock.Start;
    }

    public void StartHeader() {
        headerBlock.Start = template.Length;
    }

    public void EndHeader() {
        headerBlock.Length = template.Length - headerBlock.Start;
    }    

    public void EndBlock() {
        currentBlock.Length = template.Length - currentBlock.Start;
        blocks.Add(currentBlock);
    }

    public void Process(bool split) {
        String header = template.ToString(headerBlock.Start, headerBlock.Length);
        String footer = template.ToString(footerBlock.Start, footerBlock.Length);
        blocks.Reverse();
        foreach(Block block in blocks) {
            String fileName = Path.Combine(OutputPath, block.Name);
            if (split) {
                String content = header   template.ToString(block.Start, block.Length)   footer;
                strategy.CreateFile(fileName, content);
                template.Remove(block.Start, block.Length);
            } else {
                strategy.DeleteFile(fileName);
            }
        }
    }
}

class ManagementStrategy
{
    internal static ManagementStrategy Create(ITextTemplatingEngineHost host) {
        return (host is IServiceProvider) ? new VSManagementStrategy(host) : new ManagementStrategy(host);
    }

    internal ManagementStrategy(ITextTemplatingEngineHost host) { }

    internal virtual void CreateFile(String fileName, String content) {
        File.WriteAllText(fileName, content);
    }

    internal virtual void DeleteFile(String fileName) {
        if (File.Exists(fileName))
            File.Delete(fileName);
    }
}

class VSManagementStrategy : ManagementStrategy
{
    private EnvDTE.ProjectItem templateProjectItem;

    internal VSManagementStrategy(ITextTemplatingEngineHost host) : base(host) {
        IServiceProvider hostServiceProvider = (IServiceProvider)host;
        if (hostServiceProvider == null)
            throw new ArgumentNullException("Could not obtain hostServiceProvider");

        EnvDTE.DTE 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);
    }

    internal override void CreateFile(String fileName, String content) {
        base.CreateFile(fileName, content);
        ((EventHandler)delegate { templateProjectItem.ProjectItems.AddFromFile(fileName); }).BeginInvoke(null, null, null, null);
    }

    internal override void DeleteFile(String fileName) {
        ((EventHandler)delegate { FindAndDeleteFile(fileName); }).BeginInvoke(null, null, null, null);
    }

    private void FindAndDeleteFile(String fileName) {
        foreach(EnvDTE.ProjectItem projectItem in templateProjectItem.ProjectItems) {
            if (projectItem.get_FileNames(0) == fileName) {
                projectItem.Delete();
                return;
            }
        }
    }
}#>

ModelAuto.ttinclude

<#@ template debug="true" hostspecific="true" language="C#" #>
<#@ output extension=".cs" #>
<#@ assembly name="System.Data" #>
<#@ assembly name="System.Data.OracleClient" #>
<#@ assembly name="System.Xml" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Xml" #>
<#@ import namespace="System.Data" #>
<#@ import namespace="System.Data.OracleClient" #>
<#@ import namespace="System.Collections.Generic"#>
<#@ include file="ModelAuto.ttinclude"#>
<# var manager2 = new Manager(Host, GenerationEnvironment, true) { OutputPath = Path.GetDirectoryName(Host.TemplateFile)}; #>
<# 
ModelManager manager = new ModelManager();
List<string> list=manager.GetTableList();
#>

<# 
    foreach (var item in list)
    {
        string tableName=item;
        DataTable table= manager.GetTableSchema(tableName);
 #>

 <# 
        manager2.StartBlock(tableName ".cs");
 #>
using System;
using System.Data;
using System.Data.OracleClient;
namespace Model
{
    /// <summary>
    /// 数据表实体类:<#= tableName #> 
    /// </summary>
    [Serializable()]
    public class <#= tableName #>
    {
<#
foreach(DataRow row in table.Rows)
{
#>
       /// <summary>
       /// <#=row["备注"]#>
       /// </summary>     
       public <#= manager.TransFromSqlType(row["数据类型"].ToString())#> <#=row["字段名"]#>{ get; set; }
<#}
#>
    }
}

<# manager2.EndBlock(); #>

<#
    }  
 #>     

<# manager2.Process(true); #>

<# 
    public class ModelManager
    {
        /// <summary>
        /// 数据库连接字符串
        /// </summary>
       private const string CONNECTION_STRING = "Data Source=orcl;Persist Security Info=True;User ID=jjmis;Password=jjmis;Unicode=True";
        /// <summary>
        /// 用户信息表名
        /// </summary>
        private const string PERSONINFO_TABLE_NAME = "USERINFO";
        /// <summary>
        /// 根据表名查询表结构信息
        /// </summary>
        private const string SELECT_SCHEMA_BY_TABLE_NAME = @"SELECT A.column_name    字段名,                                                                                           
                                                                    A.data_type      数据类型,
                                                                    A.data_length    长度,
                                                                    A.data_precision 整数位,
                                                                    A.Data_Scale     小数位,
                                                                    A.nullable       允许空值,
                                                                    A.Data_default   缺省值,
                                                                    B.comments       备注,
                                                                    A.TABLE_NAME     表名
                                                                    FROM user_tab_columns A, user_col_comments B
                                                                    WHERE a.COLUMN_NAME = b.column_name
                                                                    AND A.Table_Name = B.Table_Name
                                                                    AND A.Table_Name = '{0}'";

        /// <summary>
        /// 获得数据连接
        /// </summary>
        /// <returns></returns>
        private OracleConnection GetConnection()
        {
            return new OracleConnection(CONNECTION_STRING);
        }

        /// <summary>
        /// 得到当前用户的所有表名
        /// </summary>
        /// <returns></returns>
        public List<string> GetTableList()
        {
            string sql = "SELECT * FROM USER_TABLES";
            DataTable dt = OracleHelper.ExecuteDataTable(sql);
            List<string> list = new List<string>();
            if (dt!=null&&dt.Rows.Count>0)
            {
                for (int i = 0; i < dt.Rows.Count; i  )
                {
                    list.Add(dt.Rows[i]["TABLE_NAME"].ToString());
                } 
            }
            return list;
         }

        /// <summary>
        /// 释放连接
        /// </summary>
        /// <param name="con"></param>
        private void ReleaseConnection(OracleConnection con)
        {
            if (con != null)
            {
                if (con.State == ConnectionState.Open)
                {
                    con.Close();
                }
            }
        }

        public DataTable GetTableSchema(string tableName)
        {
            DataTable dt;
            using (OracleConnection con = GetConnection())
            {
                con.Open();
                OracleCommand cmd = con.CreateCommand();
                cmd.CommandText = string.Format(SELECT_SCHEMA_BY_TABLE_NAME,tableName);
                cmd.CommandType = CommandType.Text;
                OracleDataAdapter adapter = new OracleDataAdapter(cmd);
                DataSet ds = new DataSet(); 
                adapter.Fill(ds);
                dt = ds.Tables[0];
            }

            return dt;
        }

        /// <summary>
        /// SQL[不完善,需要的自己改造]
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        public string TransFromSqlType(string type)
        {
            if (string.IsNullOrEmpty(type))
            {
                return string.Empty;
            }
            if (string.Equals(type, "number", StringComparison.OrdinalIgnoreCase))
            {
                return "int";
            }
            if (string.Equals(type, "date", StringComparison.OrdinalIgnoreCase))
            {
                return "DateTime";
            }
            else if (string.Equals(type, "nvarchar2", StringComparison.OrdinalIgnoreCase))
            {
                return "string";
            }
            return "string";
        }
    }
#>

<#  
public class OracleHelper
    {

        private static string oracleConnectionStr = "Data Source=orcl;Persist Security Info=True;User ID=jjmis;Password=jjmis;Unicode=True";
        public static DataTable ExecuteDataTable(string sql, params OracleParameter[] paramList)
        {
            using (OracleConnection conn = new OracleConnection(oracleConnectionStr))
            {
                conn.Open();
                using (OracleCommand command = conn.CreateCommand())
                {
                    command.CommandText = sql;
                    command.Parameters.AddRange(paramList);
                    DataTable dt = new DataTable();
                    OracleDataAdapter adapter = new OracleDataAdapter(command);
                    adapter.Fill(dt);
                    return dt;
                }
            }
        }

        public static int ExecuteNonQuery(string sql, params OracleParameter[] paramList)
        {
            using (OracleConnection conn = new OracleConnection(oracleConnectionStr))
            {
                conn.Open();
                using (OracleCommand command = conn.CreateCommand())
                {
                    command.CommandText = sql;
                    command.Parameters.AddRange(paramList);
                    return command.ExecuteNonQuery();
                }
            }
        }

        public static object ExecuteScalar(string sql, params OracleParameter[] paramList)
        {
            using (OracleConnection conn = new OracleConnection(oracleConnectionStr))
            {
                conn.Open();
                using (OracleCommand command = conn.CreateCommand())
                {
                    command.CommandText = sql;
                    command.Parameters.AddRange(paramList);
                    return command.ExecuteScalar();
                }
            }
        }
    }

 #>

 保存此模板文件就足以生成下边类文件。

时时app平台注册网站 5

这一行 string tables="CK_T_Template,CK_T_MES_MV,CK_T_MES_RPT,CK_T_MES_ROUNTINGS"对应于数据库中的表名,你想将哪个表转形成Model,就将表名写那,保存下就能自动生成三个与表名一样的类。

 4.Mssql

查询数据库表

    string connectionString = "Data Source=.;Initial Catalog=NFineBase;User ID=sa;Password=hjf19870810;"; 
    SqlConnection conn = new SqlConnection(connectionString); 
    conn.Open(); 
    System.Data.DataTable schema = conn.GetSchema("TABLES"); 

透过数据库表查询表结构

SELECT 表名=sobj.name,字段名=scol.name,字段说明=sprop.[value] FROM syscolumns as scol inner join sys.sysobjects as sobj on scol.id=sobj.id and sobj.xtype='U' and sobj.name<>'dtproperties' left join sys.extended_properties as sprop on scol.id=sprop.major_id and scol.colid=sprop.minor_id where sobj.name='@tableName' and scol.name='@columnName'

相符大家要生成三个类公事,需求引进 ModelAuto.ttinclude

ModelTemplate.tt文件如下

<#@ template language="C#" debug="True" hostspecific="True" #>
<#@ output extension=".cs" #>
<#@ assembly name="System.Data" #>
<#@ assembly name="System.xml" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Data.SqlClient" #>
<#@ import namespace="System.Data" #>
<#@ include file="ModelAuto.ttinclude"#>
<# var manager = new Manager(Host, GenerationEnvironment, true) { OutputPath = Path.GetDirectoryName(Host.TemplateFile)}; #>
<# 
    string connectionString = "Data Source=.;Initial Catalog=NFineBase;User ID=sa;Password=hjf19870810;"; 
    SqlConnection conn = new SqlConnection(connectionString); 
    conn.Open(); 
    System.Data.DataTable schema = conn.GetSchema("TABLES"); 
    string selectQuery = "select * from @tableName"; 
    SqlCommand command = new SqlCommand(selectQuery,conn); 
    SqlDataAdapter ad = new SqlDataAdapter(command); 
    System.Data.DataSet ds = new DataSet();

    string propQuery = "SELECT 表名=sobj.name,字段名=scol.name,字段说明=sprop.[value] FROM syscolumns as scol inner join sys.sysobjects as sobj on scol.id=sobj.id and sobj.xtype='U' and sobj.name<>'dtproperties' left join sys.extended_properties as sprop on scol.id=sprop.major_id and scol.colid=sprop.minor_id where sobj.name='@tableName' and scol.name='@columnName'"; 
    SqlCommand command2 = new SqlCommand(propQuery,conn); 
    SqlDataAdapter ad2 = new SqlDataAdapter(command2); 
    System.Data.DataSet ds2 = new DataSet();
 #>

<# 
    foreach(System.Data.DataRow row in schema.Rows) 
    {  #>   

     <# 
        manager.StartBlock(row["TABLE_NAME"] ".cs");
     #>
    //----------<#=row["TABLE_NAME"].ToString()#>开始----------

    using System;
    namespace MyProject.Entities 
    {
        /// <summary>
        /// 数据表实体类:<#= row["TABLE_NAME"].ToString() #> 
        /// </summary>
        [Serializable()]
        public class <#= row["TABLE_NAME"].ToString() #>
        {    
            <#
            ds.Tables.Clear();
            command.CommandText = selectQuery.Replace("@tableName",row["TABLE_NAME"].ToString()); 
            ad.FillSchema(ds, SchemaType.Mapped, row["TABLE_NAME"].ToString());
            foreach (DataColumn dc in ds.Tables[0].Columns)
            { 
            #>
            <# 
             ds2.Tables.Clear();
             command2.CommandText = propQuery.Replace("@tableName",row["TABLE_NAME"].ToString()); 
             command2.CommandText = command2.CommandText.Replace("@columnName",dc.ColumnName); 
             ad2.Fill(ds2);
            #> 
            /// <summary>
            /// <#= dc.DataType.Name #>:<#=ds2.Tables[0].Rows[0].ItemArray[2]#>
            /// </summary>                       
            public <#= dc.DataType.Name #> <#= dc.ColumnName #> {get;set;}   
            <# }  #>   
        }    
     }

    //----------<#=row["TABLE_NAME"].ToString()#>结束----------

    <# manager.EndBlock(); #>

<# 
    } #> 

<#
    manager.Process(true);
#>

封存ModelTemplate.tt就足以拿到类公事。

时时app平台注册网站 6

 

2.原理

我们要做的作业是经过数据库表生成实体类。

先是步 我们要查询出脚下顾客下的有所数据库表。

其次步 查询出多少库表的结构,譬喻字段的名目,字段的花色,字段的尺寸大小,是还是不是为空等等。

做事中oracle用的可比多,在这里地小编就深入分析oracle和mssql

 

1.前言

为何会有那篇小说了,近来收看了部分框架,里面要写的代码太多了,故此就想偷懒,倘若能写出三个T4模板,在数据库增多表后,根据模板就能够自动生成了类公事了,那样多好,心动不及行动。记得使用T4模板仍旧2年前,那时候听波波先生授课做大家的末段一个大体系CRM,简轻巧单的写了后生可畏晃模板,保存一下,全体的类公事就出去了,那时那一个敬拜,冷俊不禁。

时时app平台注册网站 7

 同不常候在专门的学问中,大家合作社温馨付出的叁个ORM,实体类都要团结写,多个数量库表的字段太多,写的正是手抽筋。若是您对T4根底语法不是很领悟,能够仿效作者前面写的风度翩翩篇小说 T4语法快捷入门。

如此那般,大家省去了成都百货上千代码量。

从代码里能够看出,大家在各个生成的性质里,都加多了 RaisePropertyChanged("<#=column.ColumnName#>"),那样生成的Model也足以自行触发PropertyChanged事件了。

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core.dll" #>
<#@ assembly name="System.Data.dll" #>
<#@ assembly name="System.Data.DataSetExtensions.dll" #>
<#@ assembly name="System.Xml.dll" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Xml" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Data" #>
<#@ import namespace="System.Data.SqlClient" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.IO" #>
<#@ output extension=".txt" #>

<# 
    public class DbHelper
    {
        #region GetDbTables

        public static List<DbTable> GetDbTables(string connectionString, string database)
        {
      string tables="";
            #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<DataRow>().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<DbColumn> 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<DataRow>().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);
            }
        }

        public string DbType
        {
        get
        {
        return SqlServerDbTypeMap.MapDBType(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 string MapDBType(string dbtype)
        {
            if (string.IsNullOrEmpty(dbtype)) return dbtype;
            dbtype = dbtype.ToLower();
            string csharpType = "object";
            switch (dbtype)
            {
                case "bigint": csharpType = "DbType.Int64"; break;
                case "binary": csharpType = "DbType.Binary"; break;
                case "bit": csharpType = "DbType.Boolean"; break;
                case "char": csharpType = "DbType.String"; break;
                case "date": csharpType = "DbType.DateTime"; break;
                case "datetime": csharpType = "DbType.DateTime"; break;
                case "datetime2": csharpType = "DbType.DateTime2"; break;
                case "datetimeoffset": csharpType = "DbType.DateTimeOffset"; break;
                case "decimal": csharpType = "DbType.Decimal"; break;
                case "float": csharpType = "DbType.Double"; break;
                case "image": csharpType = "DbType.Binary"; break;
                case "int": csharpType = "DbType.Int32"; break;
                case "money": csharpType = "DbType.Currency"; break;
                case "nchar": csharpType = "DbType.StringFixedLength"; break;
                case "ntext": csharpType = "DbType.String"; break;
                case "numeric": csharpType = "DbType.Decimal"; break;
                case "nvarchar": csharpType = "DbType.String"; break;
                case "real": csharpType = "DbType.Single"; break;
                case "smalldatetime": csharpType = "DbType.DateTime"; break;
                case "smallint": csharpType = "DbType.Int16"; break;
                case "smallmoney": csharpType = "DbType.Decimal"; break;
                case "sql_variant": csharpType = "DbType.Object"; break;
                case "sysname": csharpType = "DbType.Object"; break;
                case "text": csharpType = "DbType.String"; break;
                case "time": csharpType = "DbType.DateTime"; break;
                case "timestamp": csharpType = "DbType.Binary"; break;
                case "tinyint": csharpType = "DbType.Byte"; break;
                case "uniqueidentifier": csharpType = "DbType.Guid"; break;
                case "varbinary": csharpType = "DbType.Binary"; break;
                case "varchar": csharpType = "DbType.AnsiString"; break;
                case "xml": csharpType = "DbType.Xml"; break;
                default: csharpType = "DbType.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


#>

 

View Code

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".cs" #>
<#@ assembly name="System.Core.dll" #>
<#@ assembly name="System.Data.dll" #>
<#@ assembly name="System.Data.DataSetExtensions.dll" #>
<#@ assembly name="System.Xml.dll" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Xml" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Data" #>
<#@ import namespace="System.Data.SqlClient" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.IO" #>
<#@ include file="DbHelper.ttinclude"  #>
//------------------------------------------------------------------------------
//       生成时间 <#=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")#> by ly
//------------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace NFMES.Model
{    

<# 
    string tables="CK_T_Template,CK_T_MES_MV,CK_T_MES_RPT,CK_T_MES_ROUNTINGS";
    string[] ts=tables.Split(new char[]{','});
    for (int i=0;i<ts.Length;i  )
    {
        string tableName=ts[i];

 #>

    public partial class <#= tableName #>:ModelBase

    {
        <# foreach(DbColumn column in DbHelper.GetDbColumns(config.ConnectionString, config.DbDatabase, tableName)){#>

        /// <summary>
        /// <#=column.Remark#>
        /// </summary>      
        private <#= column.CSharpType#><# if(column.CommonType.IsValueType && column.IsNullable){#>?<#}#> _<#=column.ColumnName#> ;

        public <#= column.CSharpType#><# if(column.CommonType.IsValueType && column.IsNullable){#>?<#}#> <#=column.ColumnName#> 
        {
        get
        {
            return _<#=column.ColumnName#> ;
        }
        set
        {
            _<#=column.ColumnName#>=value;
            RaisePropertyChanged("<#=column.ColumnName#>");

        }
        }
        <#}#> 

    }
    <# 
}
 #>
}



<# 
    public class config
    {
        public static readonly string ConnectionString="Data Source=192.168.1.135;Initial Catalog=dbname;User ID=sa;pwd=xxx";
        public static readonly string DbDatabase="dbname";

    }
#>

我们在用ORM(例如dapper卡塔 尔(阿拉伯语:قطر‎的时候,非常多时候都急需和煦写Model层(当然也可能有广大orm框架自带了这种效能,例如ef卡塔尔国,极度是表里字段超级多的时候,三个Model要写半天,並且Model假设用于MVVM中,大家还索要加上PropertyChanged触发代码。发掘t4模板能够自动生成代码,于是就写了叁个。这些t4模板文件用了比较久了,分享下。

 

时时app平台注册网站 8

时时app平台注册网站 9

其风流浪漫t4模板引用了一个ttinclude文件,这么些文件根本管理,根据表名从数据库获取表结构,字段类型等。

本文由时时app平台注册网站发布于编程知识,转载请注明出处:c# 利用t4模板,自动生成Model类【时时app平台注册

关键词: