EF6 T4 Model.TT檔案的修改-自動加上註釋
阿新 • • 發佈:2018-12-31
找到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)#>