让SubSonic生成实体类自动加上注释

摘要: SubSonic自动根据表生成的实体类中没有注释,如果表的字段很多或是字段名句不是很规范的话,那么使用起来就很不方便了。本文针对

SubSonic 2.0.3版本做修改,让生成的实体类自动根据字段的说明生成注释。

原作:无常(wuchang@guet.edu.cn )

原文链接:http://www.cnblogs.com/wuchang/archive/2007/08/14/855806.html

  1. 首先需要给TableSchema.TableColumn类添加一个名为Description的字段:
    打开SubSonic\Sql Tools\TableSchema.cs文件,找到TableSchema类中的TableColumn类,然后添加:
    private   string  description; 
    public   string  Description
    {
        
    get  {  return  description; }
        
    set  { description  =  value; }
    打开SubSonic\Constants.cs文件,找到SqlSchemaVariable这个类,给它添加一个成员:
    public const string COLUMN_DESCRIPTION = "ColumnDescription";
  2. SubSonic\DataProviders\SqlDataProvider.cs
    将TABLE_COLUMN_SQL_ALL的SQL语句改为:
       
      private   const   string  TABLE_COLUMN_SQL_ALL  = @"
    SELECT  
        columns.TABLE_CATALOG 
    AS   [ Database ] ,
        columns.TABLE_SCHEMA 
    AS  Owner, 
        columns.TABLE_NAME 
    AS  TableName, 
        columns.COLUMN_NAME 
    AS  ColumnName, 
        columns.ORDINAL_POSITION 
    AS  OrdinalPosition, 
        columns.COLUMN_DEFAULT 
    AS  DefaultSetting, 
        columns.IS_NULLABLE 
    AS  IsNullable, columns.DATA_TYPE  AS  DataType, 
        columns.CHARACTER_MAXIMUM_LENGTH 
    AS  MaxLength, 
        columns.DATETIME_PRECISION 
    AS  DatePrecision,
        
    COLUMNPROPERTY ( object_id (columns.TABLE_SCHEMA  +   ' . '   +  TABLE_NAME), columns.COLUMN_NAME,  ' IsIdentity ' AS  IsIdentity,
        
    COLUMNPROPERTY ( object_id (columns.TABLE_SCHEMA  +   ' . '   +  TABLE_NAME), columns.COLUMN_NAME,  ' IsComputed ' as  IsComputed,
        properties.value   
    as    ColumnDescription  
    FROM   INFORMATION_SCHEMA.COLUMNS columns 
    left     join    sys.extended_properties   properties   
      
    ON     object_Id (columns.Table_Name)    =    properties.major_id   
      
    AND    columns.Ordinal_position    =    properties.minor_id
    ORDER   BY  OrdinalPosition  ASc
    " ;

    找到函数:public override TableSchema.Table GetTableSchema(string tableName, TableType tableType),
    在column.IsReadOnly = (nativeDataType == "timestamp" || isComputed);这行后面添加:
    if  (drColumns[i][SqlSchemaVariable.COLUMN_DESCRIPTION]  !=  DBNull.Value)
    {
        column.Description 
    =  ( string )drColumns[i][SqlSchemaVariable.COLUMN_DESCRIPTION];


    修改生成代码的模板
    打开\SubSonic\CodeGeneration\Templates\CS_ClassTemplate.aspx
    找到public <%=nullableVarType%> <%=propName%>,添加如下注释模板: 
             ///   <summary>
            
    ///   <%=col.Description%>
            
    ///   </summary>
            [XmlAttribute( " <%=propName%> " )]
            
    public   <%= nullableVarType %>   <%= propName %>  
  3. 找到public struct Columns,改为:

       public   struct  Columns
            {
                
    <%   foreach  (TableSchema.TableColumn col  in  cols) { %>  
                
    ///   <summary>
                
    ///   <%=col.Description%>
                
    ///   </summary>
                 public   static   string   <%= col.PropertyName %>   =   @" <%=col.ColumnName%> " ;
                
    <% } %>             
            } 

    编译解决方案,然后再用sonic.exe生成代码即可。效果如下:

表定义:

er

生成的实体类代码:

  

   ///   <summary>
    
///  This is an ActiveRecord class which wraps the Users table.
    
///   </summary>
    [Serializable]
    
public  partial  class  User : ActiveRecord < User >
    {
        
// dot.gif
         ///   <summary>
        
///  自动编号
        
///   </summary>
        [XmlAttribute( " Id " )]
        
public   int  Id 
        {
            
get  {  return  GetColumnValue < int > ( " ID " ); } 

            
set  { SetColumnValue( " ID " , value); } 

        } 

        
///   <summary>
        
///  用户名
        
///   </summary>
        [XmlAttribute( " UserName " )]
        
public   string  UserName 
        {
            
get  {  return  GetColumnValue < string > ( " UserName " ); } 

            
set  { SetColumnValue( " UserName " , value); } 

        } 

        
///   <summary>
        
///  登录密码
        
///   </summary>
        [XmlAttribute( " Password " )]
        
public   string  Password 
        {
            
get  {  return  GetColumnValue < string > ( " Password " ); } 

            
set  { SetColumnValue( " Password " , value); } 

        } 

        
// dot.gif
          public   struct  Columns
        {
            
///   <summary>
            
///  自动编号
            
///   </summary>
             public   static   string  Id  =   @" ID " ;
            
///   <summary>
            
///  用户名
            
///   </summary>
             public   static   string  UserName  =   @" UserName " ;
            
///   <summary>
            
///  登录密码
            
///   </summary>
             public   static   string  Password  =   @" Password " ;
        } 

     } 

补充一点:如果有中文的注释的话,可能会变成乱码,这时还需要将\SubSonic\Sugar\File.cs中的CreateToFile(string absolutePath, string fileText)函数修改一下:

 

public   static   void  CreateToFile( string  absolutePath,  string  fileText)
{
     File.WriteAllText(absolutePath, fileText, Encoding.Default);

 

OK了

无常 @  20070814

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值