petapoco 是個基於T4模板的輕量級ORM,好用效率高,具體介紹略了sql
獲取註釋基本原理是調用數據庫::fn_listextendedproperty函數,獲取擴展屬性MS_Description數據庫
technet 參考資料:sys.fn_listextendedproperty (Transact-SQL)函數
1、首先是 PetaPoco.Core.ttincludespa
一、106行原始:code
public string SequenceName; public bool Ignore;
新建Description字段,這個是表的註釋blog
public string SequenceName; public bool Ignore; public string Description;
二、140行原始:ip
public string SequenceName; public bool Ignore;
新建Description字段,這個是列的註釋get
public string SequenceName; public bool Ignore; public string Description;
三、517行原始:cmd
foreach (var tbl in result) { tbl.Columns=LoadColumns(tbl); // Mark the primary key string PrimaryKey=GetPK(tbl.Name); var pkColumn=tbl.Columns.SingleOrDefault(x=>x.Name.ToLower().Trim()==PrimaryKey.ToLower().Trim()); if(pkColumn!=null) { pkColumn.IsPK=true; } }
修改後,調用函數獲取表註釋:string
foreach (var tbl in result) { using(var cmdDesc=_factory.CreateCommand()) { cmdDesc.Connection = connection; cmdDesc.CommandText = TABLE_DESC_SQL; DbParameter p = null; p = cmdDesc.CreateParameter(); p.ParameterName = "@schema"; p.Value = tbl.Schema; cmdDesc.Parameters.Add(p); p = cmdDesc.CreateParameter(); p.ParameterName = "@table"; p.Value = tbl.Name; cmdDesc.Parameters.Add(p); using (var rdrDesc = cmdDesc.ExecuteReader()) { if (rdrDesc.Read()) tbl.Description = rdrDesc["value"].ToString(); } } tbl.Columns=LoadColumns(tbl); // Mark the primary key string PrimaryKey=GetPK(tbl.Name); var pkColumn=tbl.Columns.SingleOrDefault(x=>x.Name.ToLower().Trim()==PrimaryKey.ToLower().Trim()); if(pkColumn!=null) { pkColumn.IsPK=true; } }
四、572行原始,插入新代碼,獲取每一列的註釋(return result 上面):
foreach (var col in result) { using (var cmdDesc = _factory.CreateCommand()) { cmdDesc.Connection = _connection; cmdDesc.CommandText = COLUMN_DESC_SQL; DbParameter pDesc = null; pDesc = cmdDesc.CreateParameter(); pDesc.ParameterName = "@schema"; pDesc.Value = tbl.Schema; cmdDesc.Parameters.Add(pDesc); pDesc = cmdDesc.CreateParameter(); pDesc.ParameterName = "@table"; pDesc.Value = tbl.Name; cmdDesc.Parameters.Add(pDesc); pDesc = cmdDesc.CreateParameter(); pDesc.ParameterName = "@column"; pDesc.Value = col.Name; cmdDesc.Parameters.Add(pDesc); using (var rdrDesc = cmdDesc.ExecuteReader()) { if (rdrDesc.Read()) col.Description = rdrDesc["value"].ToString(); } } }
五、67二、688行原始,插入新的代碼,存儲調用函數的sql語句:
const string TABLE_DESC_SQL = @"SELECT value FROM ::fn_listextendedproperty('MS_Description', 'user', @schema, 'table', @table, null, null)"; const string COLUMN_DESC_SQL = @"SELECT value FROM ::fn_listextendedproperty('MS_Description', 'user', @schema, 'table', @table, 'column', @column)";
至此已經從數據庫獲取到了註釋,下面須要將註釋插入到T4模板中!
2、修改PetaPoco.Generator.ttinclude
一、141行原始:
<# foreach(Table tbl in from t in tables where !t.Ignore select t) { #> <# if (string.IsNullOrEmpty(tbl.Schema)) { #> [TableName("<#=tbl.Name#>")] <# } else { #>
添加表的 Description 註釋:
<# foreach(Table tbl in from t in tables where !t.Ignore select t) { #> /// <summary> /// <#=tbl.Description??""#> /// </summary> <# if (string.IsNullOrEmpty(tbl.Schema)) { #> [TableName("<#=tbl.Name#>")] <# } else { #>
二、167行原始:
<# foreach(Column col in from c in tbl.Columns where !c.Ignore select c) { // Column bindings #> <# if (TrackModifiedColumns) { #>
添加列的 Description 註釋:
<# foreach(Column col in from c in tbl.Columns where !c.Ignore select c) { // Column bindings #> /// <summary> /// <#=col.Description??""#> /// </summary> <# if (TrackModifiedColumns) { #>
這樣就改完了,打開database.tt按ctrl+s就能更新獲取到的註釋了!
另外GetInstance竟然不是單例方法,這簡直無法忍,果斷改掉:
PetaPoco.Generator.ttinclude,38行修改成:
public static <#=RepoName#> GetInstance() { if (_instance!=null) return _instance; if (Factory!=null) return Factory.GetInstance(); //else // return new <#=RepoName#>(); return _instance = new <#=RepoName#>(); }