1. 程式人生 > >EF6 T4 Model.TT檔案的修改-自動加上註釋

EF6 T4 Model.TT檔案的修改-自動加上註釋

找到mdoel.tt檔案然後開啟,按照以下操作

第一步:動態庫的引用,其中$(SolutionDir)是自動獲取專案根目錄,有些引用動態庫之後還需要引用相關的名稱空間才能正確使用,比如System.Data。

<#@ template language="C#" debug="false" hostspecific="true"#>
<#@ assembly name="System.Core"#>
<#@ assembly name="System.Data"#>
<#@ assembly name="$(SolutionDir)\SmartSI.PayManger\bin\SmartSI.Common.dll"#>
<#@ assembly name="$(SolutionDir)\SmartSI.PayManger\bin\ServiceStack.Common.dll"#>
<#@ assembly name="C:\code\gzhouRsAdmin\SmartSI.Model\bin\Debug\MySql.Data.dll" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Data" #>

第二步:實現原理,其實在更新實體的時候要去查詢資料庫的相關庫、表的欄位,然後得到註釋,這裡我使用的是mysql,語句如下,tableName是表名稱,colName是欄位名稱,table_schema是資料庫名稱

  string sql = string.Format(@"SELECT  table_name,column_comment,COLUMN_name as clnm  from
information_schema.columns where table_schema='Testdata' and 
	 column_comment is not null and column_comment !=''",tableName,colName);  

在model.tt裡建立一個實體類,這個實體類主要用來存放表的註釋資訊,下面list陣列"Listcolumn_comment"會用到

 public class modd
        {
             public string table_name { get; set; }
            public string column_comment { get; set; }
            public string clnm { get; set; }
        }

在model.tt這裡我們建立一個方法如下,其中"Listcolumn_comment"是用來儲存取到的資料庫的所有欄位註釋資訊,因為更新實體的時候是遍歷所有表,然後一個一個的去添加註釋的,所以必須把"Listcolumn_comment"設定為"static",然後再遍歷中就可以不用每次都要去查詢一次資料庫了,這樣大大縮減了更新實體的時間。

public string GetRemark(EdmProperty edmProperty){  
        //System.Diagnostics.Debugger.Launch();  
        var tableName = edmProperty.DeclaringType.Name;  
        var colName=_code.Escape(edmProperty);  
        //System.Diagnostics.Debugger.Break();  
        string sql = string.Format(@"SELECT  table_name,column_comment,COLUMN_name as clnm  from
information_schema.columns where table_schema='testdata' and 
	 column_comment is not null and column_comment !=''",tableName,colName);  
        string sqlcon = "Database=testdata;Data Source=192.168.1.2;User Id=test;Password=12345678;pooling=false;CharSet=utf8;port=3306";  
        object remark=new object();
		try{
		//用Listcolumn_comment來臨時儲存資料,避免頻繁訪問導致更新實體太慢的問題
		if (Listcolumn_comment == null)
            {
                using (MySql.Data.MySqlClient.MySqlConnection conn = new MySqlConnection(sqlcon))
                {
                    conn.Open();
                    MySqlDataAdapter command = new MySqlDataAdapter(sql, conn);
                   // MySql.Data.MySqlClient.MySqlCommand cmd = new MySql.Data.MySqlClient.MySqlCommand(sql, conn);
                    var ds = new DataSet();
                    command.Fill(ds, "ds");
                    Listcolumn_comment = ds.Tables.First().ToCopyModel<List<modd>>();
					remark = Listcolumn_comment.FirstOrDefault(p =>
                    p.table_name.Equals(tableName) & p.clnm.Equals(colName))?.column_comment;
                }
            }
            else
            {
                remark = Listcolumn_comment.FirstOrDefault(p =>
                    p.table_name.Equals(tableName) & p.clnm.Equals(colName))?.column_comment;
            }

        
			}
			catch (Exception e)
			{
			remark=e;
			}
          
    return remark+"";  
    }     

第三步:在model.tt檔案裡找到"<#=codeStringGenerator.Property(edmProperty)#>",在其上方新增

/// <summary>
    /// <#=codeStringGenerator.GetRemark(edmProperty)#>  

    /// </summary> 

這裡主要是通過方法GetRemark來獲取到註釋資訊

新增之後的資訊如下:

	/// <summary>
    /// <#=codeStringGenerator.GetRemark(edmProperty)#>  
    /// </summary>  
    <#=codeStringGenerator.Property(edmProperty)#>