SubSonic 2.0.3版本做修改,让生成的实体类自动根据字段的说明生成注释。
原作:无常(wuchang@guet.edu.cn )
原文链接:http://www.cnblogs.com/wuchang/archive/2007/08/14/855806.html
- 首先需要给TableSchema.TableColumn类添加一个名为Description的字段:
打开SubSonic\Sql Tools\TableSchema.cs文件,找到TableSchema类中的TableColumn类,然后添加:
private string description;打开SubSonic\Constants.cs文件,找到SqlSchemaVariable这个类,给它添加一个成员:
public string Description
{
get { return description; }
set { description = value; }
}
public const string COLUMN_DESCRIPTION = "ColumnDescription"; - 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 %> -
找到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生成代码即可。效果如下:
表定义:
生成的实体类代码:
///
<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 " ;
}
}
/// 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);
}
{
File.WriteAllText(absolutePath, fileText, Encoding.Default);
}
OK了
无常 @ 20070814