您的位置:首页 > 数据库

petapoco-SQLServer模型增加注释

2017-08-10 00:14 162 查看
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#>();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: