codesmith4.0我自定义的模版
问题1。“bulid”的时候没报错,但是“run”的时候报错:
validation errors:
Namespace is required,Description is required,还有其他的is requered(Namespace和Description都是我定义的Property Name)
问题2。如果我只bulid,不run.然后我右键我的自定义模板,接着execute,弹出属性对话框,我把自定义的属性都填好后,generate却没有在指定文件夹里生成的.cs文件。以下是源代码:
<%@ CodeTemplate Language="C#" TargetLanguage="C#" Src="" Inherits="" Debug="True" Description=" This template is create entity" ResponseEncoding="UTF-8" %>
<%@ Assembly Name="System.Design" %>
<%@ Assembly Name="System.Data" %>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Assembly Name="CodeSmith.CustomProperties" %>
<%@ Import Namespace="SchemaExplorer" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Data" %>
<%@ Property Name="DeveloperName" Type="System.String" Category="Context" Default="wang" ResponseEncoding="UTF-8" %>
<%@ Property Name="SourceDataBase" Type="SchemaExplorer.DatabaseSchema" Category="Context" %>
<%@ Property Name="SourceDataTable" Type="System.String" Optional="False" Category="Context" %>
<%@ Property Name="NameSpace" Type="System.String" Category="Context" %>
<%@ Property Name="Description" Type="System.String" Category="" Description="About the entity" %> <% if(!Directory.Exists(OutputDirectory)) Directory.CreateDirectory(OutputDirectory); %>// File: <%= SourceDataTable %>.cs
// <%=DateTime.Now.ToShortDateString() %> : <%=DeveloperName %> Original Version
//
// ===================================================================using System;
using System.Collections.Generic;
using System.Text;namespace <%= NameSpace %>
{
/// <summary>
/// <%= Description %>
///</summary>
public class <%= SourceDataTable %>
{
#region Fields
<%
ColumnSchemaCollection columns=rule.GetColumnCollection(SourceDataBase,SourceDataTable);
for(int i=0;i<columns.Count;i++)
{
Response.Write("//"+columns[i].Description+"\r\n");
Response.Write(" private "+rule.GetType(columns[i])+" f_"+columns[i].Name+";\r\n");
}
%>
#endregion
<% Debugger.Break();%>
#region Properties
<%
for(int i=0;i<columns.Count;i++)
{
%>
///<summary>
///<%= columns[i].Description %>
///</summary>
public <%= rule.GetType(columns[i]) %> <%= columns[i].Name %>
{
get { return f_<%= columns[i].Name %>; }
set { f_<%= columns[i].Name %>=value; }
}
<%
}
%>
#endregion
}
}<script runat="template">
public class CodeTemplateRule
{
public ColumnSchemaCollection GetColumnCollection(DatabaseSchema dataBase,string dataTable)
{
TableSchemaCollection tables = new TableSchemaCollection(dataBase.Tables);
ColumnSchemaCollection columns=null;
for(int i=0;i<tables.Count;i++)
{
if(tables[i].Name.ToUpper()==dataTable.ToUpper())
{
TableSchema ts=tables[i];
columns=new ColumnSchemaCollection(ts.Columns);
}
}
return columns;
}
/*函数作用:输入数据库名和表名,得到列集合信息。用内部函数ColumnSchemaCollection可以得到某张表的所有列的集合。*/
/*
public string GetDataTable(string DataTable)
{
int i=DataTable.IndexOf("_");
return DataTable.Substring(i+1,DataTable.Length-(i+1));
}
函数作用:对输入的表名格式化,得到去掉前缀的表名,如PE_User,返回User。
*/
public string GetType(ColumnSchema column)
{
if (column.Name.EndsWith("TypeCode"))
return column.Name;
switch (column.DataType)
{
case DbType.AnsiString: return "string";
case DbType.AnsiStringFixedLength: return "string";
case DbType.Binary: return "byte[]";
case DbType.Boolean: return "bool";
case DbType.Byte: return "int";
case DbType.Currency: return "decimal";
case DbType.Date: return "DateTime";
case DbType.DateTime: return "DateTime";
case DbType.Decimal: return "decimal";
case DbType.Double: return "double";
case DbType.Guid: return "Guid";
case DbType.Int16: return "short";
case DbType.Int32: return "int";
case DbType.Int64: return "long";
case DbType.Object: return "object";
case DbType.SByte: return "sbyte";
case DbType.Single: return "float";
case DbType.String: return "string";
case DbType.StringFixedLength: return "string";
case DbType.Time: return "TimeSpan";
case DbType.UInt16: return "ushort";
case DbType.UInt32: return "uint";
case DbType.UInt64: return "ulong";
case DbType.VarNumeric: return "decimal";
default:
{
return "__UNKNOWN__" + column.NativeType;
}
}
}
/*函数作用:得到表字段的类型。*/
public string GetDefaultValue(ColumnSchema column)
{
if (column.Name.EndsWith("TypeCode"))
return column.Name;
switch (column.DataType)
{
case DbType.AnsiString: return "\"\"";
case DbType.AnsiStringFixedLength: return "\"\"";
case DbType.Binary: return "null";
case DbType.Boolean: return "false";
case DbType.Byte: return "0";
case DbType.Currency: return "0";
case DbType.Date: return "DateTime.Parse(\"1900-1-1\")";
case DbType.DateTime: return "DateTime.Parse(\"1900-1-1\")";
case DbType.Decimal: return "0";
case DbType.Double: return "0";
case DbType.Guid: return "Guid.NewGuid().ToString()";
case DbType.Int16: return "0";
case DbType.Int32: return "0";
case DbType.Int64: return "0";
case DbType.Object: return "\"\"";
case DbType.SByte: return "0";
case DbType.Single: return "0";
case DbType.String: return "\"\"";
case DbType.StringFixedLength: return "";
case DbType.Time: return "DateTime.Parse(\"1900-1-1\")";
case DbType.UInt16: return "0";
case DbType.UInt32: return "0";
case DbType.UInt64: return "0";
case DbType.VarNumeric: return "0";
default:
{
return "__UNKNOWN__" + column.NativeType;
}
}
}
/*函数作用:得到表字段的默认值。*/
}
CodeTemplateRule rule=new CodeTemplateRule();
#region Output
private string _outputDirectory = String.Empty;
[Editor(typeof(System.Windows.Forms.Design.FolderNameEditor), typeof(System.Drawing.Design.UITypeEditor))]
[CodeTemplateProperty(CodeTemplatePropertyOption.Optional)]
[Category("General")]
[Description("The directory to output the results to.")]
[DefaultValue("")]
public string OutputDirectory
{
get
{
if (_outputDirectory.Length == 0)
{
return @"G:\EntityOutput";
}
else
{
return _outputDirectory;
}
}
set
{
if (value.EndsWith("\\")) value = value.Substring(0, value.Length - 1);
_outputDirectory = value;
}
}
#endregion</script>
请朋友们帮忙看看,谢谢。
问题1。“bulid”的时候没报错,但是“run”的时候报错:
validation errors:
Namespace is required,Description is required,还有其他的is requered(Namespace和Description都是我定义的Property Name)
问题2。如果我只bulid,不run.然后我右键我的自定义模板,接着execute,弹出属性对话框,我把自定义的属性都填好后,generate却没有在指定文件夹里生成的.cs文件。以下是源代码:
<%@ CodeTemplate Language="C#" TargetLanguage="C#" Src="" Inherits="" Debug="True" Description=" This template is create entity" ResponseEncoding="UTF-8" %>
<%@ Assembly Name="System.Design" %>
<%@ Assembly Name="System.Data" %>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Assembly Name="CodeSmith.CustomProperties" %>
<%@ Import Namespace="SchemaExplorer" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Data" %>
<%@ Property Name="DeveloperName" Type="System.String" Category="Context" Default="wang" ResponseEncoding="UTF-8" %>
<%@ Property Name="SourceDataBase" Type="SchemaExplorer.DatabaseSchema" Category="Context" %>
<%@ Property Name="SourceDataTable" Type="System.String" Optional="False" Category="Context" %>
<%@ Property Name="NameSpace" Type="System.String" Category="Context" %>
<%@ Property Name="Description" Type="System.String" Category="" Description="About the entity" %> <% if(!Directory.Exists(OutputDirectory)) Directory.CreateDirectory(OutputDirectory); %>// File: <%= SourceDataTable %>.cs
// <%=DateTime.Now.ToShortDateString() %> : <%=DeveloperName %> Original Version
//
// ===================================================================using System;
using System.Collections.Generic;
using System.Text;namespace <%= NameSpace %>
{
/// <summary>
/// <%= Description %>
///</summary>
public class <%= SourceDataTable %>
{
#region Fields
<%
ColumnSchemaCollection columns=rule.GetColumnCollection(SourceDataBase,SourceDataTable);
for(int i=0;i<columns.Count;i++)
{
Response.Write("//"+columns[i].Description+"\r\n");
Response.Write(" private "+rule.GetType(columns[i])+" f_"+columns[i].Name+";\r\n");
}
%>
#endregion
<% Debugger.Break();%>
#region Properties
<%
for(int i=0;i<columns.Count;i++)
{
%>
///<summary>
///<%= columns[i].Description %>
///</summary>
public <%= rule.GetType(columns[i]) %> <%= columns[i].Name %>
{
get { return f_<%= columns[i].Name %>; }
set { f_<%= columns[i].Name %>=value; }
}
<%
}
%>
#endregion
}
}<script runat="template">
public class CodeTemplateRule
{
public ColumnSchemaCollection GetColumnCollection(DatabaseSchema dataBase,string dataTable)
{
TableSchemaCollection tables = new TableSchemaCollection(dataBase.Tables);
ColumnSchemaCollection columns=null;
for(int i=0;i<tables.Count;i++)
{
if(tables[i].Name.ToUpper()==dataTable.ToUpper())
{
TableSchema ts=tables[i];
columns=new ColumnSchemaCollection(ts.Columns);
}
}
return columns;
}
/*函数作用:输入数据库名和表名,得到列集合信息。用内部函数ColumnSchemaCollection可以得到某张表的所有列的集合。*/
/*
public string GetDataTable(string DataTable)
{
int i=DataTable.IndexOf("_");
return DataTable.Substring(i+1,DataTable.Length-(i+1));
}
函数作用:对输入的表名格式化,得到去掉前缀的表名,如PE_User,返回User。
*/
public string GetType(ColumnSchema column)
{
if (column.Name.EndsWith("TypeCode"))
return column.Name;
switch (column.DataType)
{
case DbType.AnsiString: return "string";
case DbType.AnsiStringFixedLength: return "string";
case DbType.Binary: return "byte[]";
case DbType.Boolean: return "bool";
case DbType.Byte: return "int";
case DbType.Currency: return "decimal";
case DbType.Date: return "DateTime";
case DbType.DateTime: return "DateTime";
case DbType.Decimal: return "decimal";
case DbType.Double: return "double";
case DbType.Guid: return "Guid";
case DbType.Int16: return "short";
case DbType.Int32: return "int";
case DbType.Int64: return "long";
case DbType.Object: return "object";
case DbType.SByte: return "sbyte";
case DbType.Single: return "float";
case DbType.String: return "string";
case DbType.StringFixedLength: return "string";
case DbType.Time: return "TimeSpan";
case DbType.UInt16: return "ushort";
case DbType.UInt32: return "uint";
case DbType.UInt64: return "ulong";
case DbType.VarNumeric: return "decimal";
default:
{
return "__UNKNOWN__" + column.NativeType;
}
}
}
/*函数作用:得到表字段的类型。*/
public string GetDefaultValue(ColumnSchema column)
{
if (column.Name.EndsWith("TypeCode"))
return column.Name;
switch (column.DataType)
{
case DbType.AnsiString: return "\"\"";
case DbType.AnsiStringFixedLength: return "\"\"";
case DbType.Binary: return "null";
case DbType.Boolean: return "false";
case DbType.Byte: return "0";
case DbType.Currency: return "0";
case DbType.Date: return "DateTime.Parse(\"1900-1-1\")";
case DbType.DateTime: return "DateTime.Parse(\"1900-1-1\")";
case DbType.Decimal: return "0";
case DbType.Double: return "0";
case DbType.Guid: return "Guid.NewGuid().ToString()";
case DbType.Int16: return "0";
case DbType.Int32: return "0";
case DbType.Int64: return "0";
case DbType.Object: return "\"\"";
case DbType.SByte: return "0";
case DbType.Single: return "0";
case DbType.String: return "\"\"";
case DbType.StringFixedLength: return "";
case DbType.Time: return "DateTime.Parse(\"1900-1-1\")";
case DbType.UInt16: return "0";
case DbType.UInt32: return "0";
case DbType.UInt64: return "0";
case DbType.VarNumeric: return "0";
default:
{
return "__UNKNOWN__" + column.NativeType;
}
}
}
/*函数作用:得到表字段的默认值。*/
}
CodeTemplateRule rule=new CodeTemplateRule();
#region Output
private string _outputDirectory = String.Empty;
[Editor(typeof(System.Windows.Forms.Design.FolderNameEditor), typeof(System.Drawing.Design.UITypeEditor))]
[CodeTemplateProperty(CodeTemplatePropertyOption.Optional)]
[Category("General")]
[Description("The directory to output the results to.")]
[DefaultValue("")]
public string OutputDirectory
{
get
{
if (_outputDirectory.Length == 0)
{
return @"G:\EntityOutput";
}
else
{
return _outputDirectory;
}
}
set
{
if (value.EndsWith("\\")) value = value.Substring(0, value.Length - 1);
_outputDirectory = value;
}
}
#endregion</script>
请朋友们帮忙看看,谢谢。
<%@ Import Namespace="System.Data" %>
这个好像直接用using就可以了吧,我很菜...
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Data" %>
cs里用using,看具体情况