1. 程式人生 > >petapoco-SQLServer模型增加註釋

petapoco-SQLServer模型增加註釋

cor == tran end leo instance 屬性 scrip ati

petapoco 是個基於T4模板的輕量級ORM,好用效率高,具體介紹略了

獲取註釋基本原理是調用數據庫::fn_listextendedproperty函數,獲取擴展屬性MS_Description

technet 參考資料:sys.fn_listextendedproperty (Transact-SQL)

一、首先是 PetaPoco.Core.ttinclude

  1、106行原始:

public string SequenceName;
public bool Ignore;

  新建Description字段,這個是表的註釋

public string SequenceName;
public bool Ignore; public string Description;

  2、140行原始:

public string SequenceName;
public bool Ignore;

  新建Description字段,這個是列的註釋

public string SequenceName;
public bool Ignore;
public string Description;

  3、517行原始:

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; } }

  修改後,調用函數獲取表註釋:

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; } }

  4、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();
        }
    }
}

  5、672、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模板中!

二、修改PetaPoco.Generator.ttinclude

  1、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 { #>

  2、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#>();
}

petapoco-SQLServer模型增加註釋