petapoco-SQLServer模型增長註釋

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#>();
}
相關文章
相關標籤/搜索