让SubSonic生成实体类自动加上注释
2007-08-14 20:41 无常 阅读(2917) 评论(7) 编辑 收藏 举报
摘要:SubSonic自动根据表生成的实体类中没有注释,如果表的字段很多或是字段名句不是很规范的话,那么使用起来就很不方便了。本文针对
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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2004-08-14 文件上传
2004-08-14 用VML技术实现统计图形的绘制(考试系统中的试卷分析模块)