代码改变世界

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

2007-08-14 20:41  无常  阅读(2903)  评论(7编辑  收藏  举报
摘要: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>
    {
        
//
        /// <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); } 

        } 

        
//
         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