codesmith求CodeSmith .NET三层架构模板
codesmith 时间:2021-06-22 阅读:(
)
codeSmith 生成Models层的模板怎么写
CREATE TABLE datatype ( id int IDENTITY(1,1) PRIMARY KEY NOT NULL,--主键 updatetime datetime default(getdate()),--更新时间 userid int,--操作人 isdelete int ,--删除标示 0 表示正常 1表示删除 typename varchar(200),--部门名称 typeid int,--部门id )GO这是建库 代码如何使用CodeSmith批量生成代码
在上一篇我们已经用PowerDesigner创建好了需要的测试数据库,下面就可以开始用它完成批量代码生成的工作啦.
下面我会一步步的解释如何用CodeSmith实现预期的结果的,事先声明一下,在此只做一个简单的Demo,并不详细的讲解CodeSmith各个强大的功能,有兴趣的朋友可以打开CodeSmith的帮助文档了解.我只做个抛砖引玉,希望能激起大家更多思想的火花~
先看看CodeSmith的工作原理:
简单的说:CodeSmith首先会去数据库获取数据库的结构,如各个表的名称,表的字段,表间的关系等等,之后再根据用户自定义好的模板文件,用数据库结构中的关键字替代模板的动态变量,最终输出并保存为我们需要的目标文件.好,原理清楚了,就开始实践吧:
1. 运行CodeSmith,可以看到如下界面:
2. CodeSmith是创建模板的地方,首先当然是创建一个模板啦,点击工具栏最左边的New Document—C# Template,如图所示:
3. 点击运行按钮,运行结果如下:
好,我们来分析为什么会得到这样的运行结果吧,点击运行窗口左下角的Template按钮返回模板设计窗口,可以发现,只要是没有被<%%>或者<scriptrunat="template"></script>包含的文字均被直接输出了,这些以后就要被换成我们分层架构中一些一成不变的模板代码:
4. 好了,简单了解啦一些CodeSmith的代码结构,下面就开始用它来生成我们的分层代码吧,在此我就不介绍分层架构的概念了,不然就偏离主题了.为了能更简单明了的说明,我们在此就只用CodeSmith生成分层架构的实体层吧.先看看如果我们不使用CodeSmith需要手动敲出哪些代码:
Major.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Entity
{
publicpartialclass Major
{
publicInt32 MajorID{ get;set; }
publicString Name{ get;set; }
publicString Remark{ get;set; }
}
}
Student.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Entity
{
publicpartialclass Student
{
publicString StudentID{ get;set; }
publicInt32 MajorID{ get;set; }
publicString Name{ get;set; }
publicBoolean Sex{ get;set; }
publicInt32 Age{ get;set; }
publicString Remark{ get;set; }
}
}
我将两个文件中重复的代码使用黄色背景色加深了,我们可以发现,如果每个表都要通过手动创建,那么将有大量的代码(黄色背景)需要复制粘贴操作,这些操作是繁琐而没有任何意义的.因此,我们会希望将黄色背景部分的代码做成模板,而其他变化的代码由数据库的结构动态生成,如此一来,我们就不用再为这些烦人的复制粘贴操作懊恼了.
5. 那么就开始我们的实践吧,就在刚刚创建好的文件开始吧,先随意保存到一个目录下,命名为test.cst,接着删除多余的代码,只保留第一行,该行表明我们的模板使用何种语言,这里我们使用C#.
<%@ CodeTemplateLanguage="C#" TargetLanguage="Text" Src="" Inherits=""Debug="False" CompilerVersion="v3.5"Description="Template description here."%>
6. 参照CodeSmith的工作原理,我们首先要为CodeSmith提供一个数据库,要怎么使它和SQL Server 2005关联起来呢?只要加上下面的代码就行了:
<%-- 加载访问数据库的组件SchemaExplorer,并声明其使用的命名空间 --%>
<%@ AssemblyName="SchemaExplorer"%>
<%@ ImportNamespace="SchemaExplorer"%>
<%-- 数据库 --%>
<%@ PropertyName="SourceDatabase"DeepLoad="True" Optional="False" Category="01. GettingStarted - Required" Description="Database that the tables views, and storedprocedures should be based on. IMPORTANT!!! If SourceTables and SourceViews areleft blank, the Entire Database will then be generated."%>
7. 好了,有了数据库连接,接着还需要一个模板,为了便于管理,我们新建一个文件用于设计模板,File—New—Blank Template,并添加如下代码,最好保存到test.cst所在的文件夹内,命名为Entity.cst:
<%@ CodeTemplateInherits="CodeTemplate"TargetLanguage="Text" Description="NetTiers main template."Debug="True" ResponseEncoding="UTF-8"%>
<%@ AssemblyName="SchemaExplorer" %>
<%@ ImportNamespace="SchemaExplorer" %>
<%-- 要打印的表 --%>
<%@ PropertyName="Table" DeepLoad="True"Optional="False" Category="01. Getting Started - Required"Description="Database that the tables views, and stored procedures shouldbe based on. IMPORTANT!!! If SourceTables and SourceViews are left blank, theEntire Database will then be generated." %>
接着继续添加如下代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Entity
{
publicpartialclass<%= Table.Name%>
{
<%foreach(ColumnSchema col inTable.Columns){ %>
public<%= col.DataType %><%=col.Name %>{ get;set; }
<% } %>
}
}
<%=Table.Name%> 表示在此处输出表的名称
<%foreach(ColumnSchema col in Table.Columns){ %> <% } %> 为循环语句,在{}循环输出列信息.
<%=col.DataType %> 表示在此处输出列的类型
<%=col.Name %> 表示在此处输出列的名称
如图所示:
8. 模板创建好后,要在test.cst文件中注册一下,不然人家怎么知道有你这么一个模板存在呀,在test.cst文件继续输入如下代码:
<%-- 注册实体层Entity模板 --%>
<%@ RegisterName="EntityTemplate" Template=" Entity.cst"MergeProperties="Flase" ExcludeProperties=""%>
9. 好了,模板注册好了,根据CodeSmith工作原理,我们要结合模板和数据库结构来批量生成代码啦,但是我们生成的目标文件要输出到哪里呢?这时我们会需要一个用户自定义属性,用于设置目标文件的输出目录,在test.cst文件的末尾输入如下代码:
代码
10. 现在连输出目录也有了,该想办法写些函数来完成将数据库架构传递给模板的工作啦,在test.cst文件的末尾输入如下代码:
代码
CodeTemplateTemplate = new EntityTemplate(); 就是创建了一个新的模板
foreach(TableSchematable in this. SourceDatabase.Tables){} 表示循环输出数据库中的表
Template.SetProperty("Table",table); 就是向模板设置属性,还记得我们在Entity.cst里面设置了一个Table属性吗,我们就是通过这个方法给这个属性设值的.
Template.RenderToFile(FileDirectory,true); 表示将Temlate里的内容全部输出到FileDirectory目录中,true表示如果文件存在直接覆盖.
11. 函数写好了,离成功不远啦,我们在test.cst的最后再添加如下代码,用于调用刚刚写好的函数.至此,模板文件的制作已经完成.
<%
//创建实体层Entity类
this.GenerateEntityClasses();
Debug.WriteLine("OK");
%>
12. 好啦,现在只要设置我们要导出的数据库和输出目录就可以运行看结果啦,点击CodeSmith主窗体右下角Properities面板中SourceDatabase属性栏右侧的…按钮,弹出数据库设置对话框,我们要在此添加一个新的数据库连接:
13. 点击Add按钮,属性设置如图,我们选择的是在前一章用PowerDesigner创建好的PD_test数据库:
14. 点击OK,回到数据库选择对话框,选择刚刚创建好的数据库连接:
15. 接着是设置目标文件输出目录,我在这里设置为桌面的一个新建文件夹:
16. OK,万事俱备,可以点击运行按钮让CodeSmith为我们批量生成代码啦:
打开生成的文件,就可以看到我们期待看到的代码啦:
好了,这些是基础,但是只要你掌握了这些就可以开始自己的CodeSmith之旅啦,我也只能送大家到此咯~其他更多的知识点希望大家能自行查看帮助文章或者上网查询,很高兴又和大家分享了自己的一点心得,接下来想再回头复习一下设计模式,也打算写一些文章,欢迎大家关注~
黄聪:如何使用CodeSmith批量生成代码(原创系列教程) 转载,仅供参考,祝你愉快,满意请采纳。
CodeSmith中的DbType获取SQL中的Money类型
网上搜的 对应关系
SqlServer CodeSmith
bigint Int64
binary Binary
bit Boolean
char AnsiStringFixedLength
datetime DateTime
decimal Decimal
float Double
image Binary
int Int32
money Currency
nchar StringFixedLength
ntext String
numeric Decimal
nvarchar String
real Single
smalldatetime DateTime
smallint Int16
smallmoney Currency
sql_variant Object
text AnsiString
timestamp Binary
tinyint Byte
uniqueidentifier Guid
varbinary Binary
varchar AnsiString求 CodeSmith 4.0 的注册码
CodeSmith Professional v4.0.0.1724 - 序列号
COMPANY: www.SERIALS.WS UNLOCK
KEY: CS40P-JOUSN-RV58D-M9FVK-TMTTG-N0S3B ACTIVATION
KEY: 9BUO6M8W-37PS4I2J-XMWU4MPX-KHWLTCQZ-D47I4DLF-B2LDN2RV-CRKDBI4C-6MV994R1Codesmith中自定义类的程序集在哪,怎么引用它??
CodeSmith 是一种语法类似于的基于模板的代码生成器,程序可以自定义模板,从而减少重复编码的劳动量,提高效率。
安装CodeSmith 2.6注册后发现有两个可运行程序CodeSmith Studio.exe和CodeSmith Explorer.exe CodeSmith Studio.exe用来创建自定义模板 CodeSmith Explorer.exe用来导入模板并且生成代码 打开 CodeSmith Studio.exe,新建一个C#模板。
发现有如下类似与的标识符号 <% %> <%= %> <%@ %> <script runat="template"> </script>求CodeSmith .NET三层架构模板
<span?style="font-family:Microsoft?YaHei;font-size:13px;"><%@?CodeTemplate?Language="C#"?TargetLanguage="C#"?Description="Generates?a?class?including?a?special?informational?header"?%>
<%@?Assembly?Name="SchemaExplorer"?%>
<%@?Import?Namespace="SchemaExplorer"?%>
<%@?Import?Namespace="System.Text"?%>
<%@?Property?Name="NameSpace"?Type="String"?Category="Context"?Description="The?namespace?to?use?for?this?class"?%>
<%@?Property?Name="TableName"?Type="SchemaExplorer.TableSchema"?DeepLoad="True"?Optional="False"?Category="Context"?Description="The?name?of?the?table?to?generate"?%>
<%@?Property?Name="Author"?Type="String"?Category="Context"??Description="Author"?%>
<%@?Property?Name="TablePrefix"?Type="System.String"?Default="T"?Category="Context"?Description="The?prefix?to?remove?from?table?names"?%>
/*------------------------------------------------
//?File?Name:<%=ClearPrefix(TableName.Name)?%>Info.cs
//?File?Description:<%=ClearPrefix(TableName.Name)?%>?DataBase?Entity
//?Author:<%=Author%>
//?Create?Time:<%=?DateTime.Now.ToString("yyyy/MM/dd?HH:mm:ss")%>
//------------------------------------------------*/
using?System;
namespace?<%=NameSpace%>.Model
{
???///?<summary>
???///?Description?<%=TableName.Description?%>
???///?</summary>
???[Serializable]
???public?class?<%=ClearPrefix(TableName.Name)?%>Info
???{
????#region?Private?Protery
????<%for(int?i=0;i<TableName.Columns.Count;i++){%>
????private?<%=CSharpType(TableName.Columns[i])%>?_<%=TableName.Columns[i].Name.Substring(0,1).ToLower()+TableName.Columns[i].Name.Substring(1,TableName.Columns[i].Name.Length-1)%>;
????<%}%>
????#endregion
????#region?Constructor?
????///?<summary>
????///?<%=ClearPrefix(TableName.Name)?%>?Constructor
????///?</summary>
?????public?<%=ClearPrefix(TableName.Name)?%>Info()
?????{
?????}
????///?<summary>
????///?<%=ClearPrefix(TableName.Name)?%>?Constructor?With?Parameters
????///?</summary>
????<%for(int?i=0;i<TableName.Columns.Count;i++){%>
????///<param?name="<%=TableName.Columns[i].Name.Substring(0,1).ToLower()+TableName.Columns[i].Name.Substring(1,TableName.Columns[i].Name.Length-1)%>"><%if(TableName.Columns[i].Description.Length>0){%><%=TableName.Columns[i].Name+"??"+TableName.Columns[i].Description%><%}else{%><%=TableName.Columns[i].Name%><%}%></param>
????<%}%>
????public?<%=ClearPrefix(TableName.Name)?%>Info(<%for(int?i=0;i<TableName.Columns.Count;i++){%><%=CSharpType(TableName.Columns[i])%>?<%=TableName.Columns[i].Name.Substring(0,1).ToLower()+TableName.Columns[i].Name.Substring(1,TableName.Columns[i].Name.Length-1)%><%?if?(i?<?TableName.Columns.Count?-?1)?{?%>,<%}%><%}%>)
????{
????<%for(int?i=0;i<TableName.Columns.Count;i++){%>
?????this._<%=TableName.Columns[i].Name.Substring(0,1).ToLower()+TableName.Columns[i].Name.Substring(1,TableName.Columns[i].Name.Length-1)%>?=?<%=TableName.Columns[i].Name.Substring(0,1).ToLower()+TableName.Columns[i].Name.Substring(1,TableName.Columns[i].Name.Length-1)%>;
????<%}%>
????}
????#endregion
????#region?Public?Property
????????<%for(int?i=0;i<TableName.Columns.Count;i++){%>
????///<Summary>
????///?<%=TableName.Columns[i].Name%><%if(TableName.Columns[i].Description.Length>0){%>
????///?<%=TableName.Columns[i].Description%><%}%>
????///</Summary>
???public?<%=CSharpType(TableName.Columns[i]).Trim()%>?<%=TableName.Columns[i].Name%>
????{
????get?{?return?_<%=TableName.Columns[i].Name.Substring(0,1).ToLower()+TableName.Columns[i].Name.Substring(1,TableName.Columns[i].Name.Length-1)%>;?}
?????set?{??_<%=TableName.Columns[i].Name.Substring(0,1).ToLower()+TableName.Columns[i].Name.Substring(1,TableName.Columns[i].Name.Length-1)%>?=?value;?}
????}
??<%}%>
????#endregion??
???}
}
<script?runat="template">
public?string?CSharpType(ColumnSchema?column)
{
?if?(column.Name.EndsWith("TypeCode"))?return?column.Name;
?switch?(column.DataType)
?{
??case?DbType.AnsiString:
??case?DbType.String:
??case?DbType.StringFixedLength:
??case?DbType.AnsiStringFixedLength:?return?"string";
??case?DbType.VarNumeric:
??case?DbType.Currency:
??case?DbType.Decimal:?return?"decimal";
??case?DbType.Binary:?return?"byte[]";
??case?DbType.Boolean:?return?"bool";
??case?DbType.Byte:?return?"byte";
??case?DbType.Date:?return?"DateTime";
??case?DbType.DateTime:?return?"DateTime";
??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.Time:?return?"TimeSpan";
??case?DbType.UInt16:?return?"ushort";
??case?DbType.UInt32:?return?"uint";
??case?DbType.UInt64:?return?"ulong";
??default:
??{
???return?"__UNKNOWN__"?+?column.NativeType;
??}
?}
}
public?string?ClearPrefix(string?name)
{
????int?mIndex=name.IndexOf(TablePrefix);
????string?strResult=name.Remove(0,TablePrefix.Length);
????return?strResult;
}
</script></span>
月神科技怎么样?月神科技是由江西月神科技有限公司运营的一家自营云产品的IDC服务商,提供香港安畅、香港沙田、美国CERA、华中电信等机房资源,月神科技有自己的用户群和拥有创宇认证,并且也有电商企业将业务架设在月神科技的平台上。目前,香港CN2云服务器、洛杉矶CN2云主机、华中电信高防vps,月付20元起。点击进入:月神科技官方网站地址月神科技vps优惠信息:香港安畅CN2-GIA低至20元核心:2...
这次RackNerd商家提供的美国大硬盘独立服务器,数据中心位于洛杉矶multacom,可选Windows、Linux镜像系统,默认内存是64GB,也可升级至128GB内存,而且硬盘采用的是256G SSD系统盘+10个16TSAS数据盘,端口提供的是1Gbps带宽,每月提供200TB,且包含5个IPv4,如果有需要更多IP,也可以升级增加。CPU核心内存硬盘流量带宽价格选择2XE5-2640V2...
10GBIZ服务商经常有看到隔壁的一些博客分享内容,我翻看网站看之前有记录过一篇,只不过由于服务商是2020年新成立的所以分享内容比较谨慎。这不至今已经有将近两年的服务商而且云服务产品也比较丰富,目前有看到10GBIZ服务商有提供香港、美国洛杉矶等多机房的云服务器、独立服务器和站群服务器。其中比较吸引到我们用户的是亚洲节点的包括香港、日本等七星级网络服务。具体我们看看相关的配置和线路产品。第一、香...
codesmith为你推荐
订房系统求酒店开房系统mergefieldWORD 邮件合并中----插入的域{MERGEFIELD "班级"},原始1201班想得到前连个字符怎么改域代码?4k超高清视频下载哪里有4K片源下载啊?补充:刚入手了一个4k电视盒,小美盒子V9,说是支持4k。正好我的电视机是4k的,想知道哪里有得下载呢?有朋友说我傻,现在基本上没有4k片源下载,而且不知道什么时候才有。等到流行的时候也许这个机器又淘汰啦!我该怎么办啊?短信营销方案短信平台应该如何推广和运营啊?无处不在的意思成语无处不在无所不能。下面的意思可以用什么成语来形容shoujiao手机电池突然充不上电,是怎么回事?该怎么办?shoujiao求【叫兽】的简介shoujiao如何区分是不是颈椎病?短信套餐手机短信都有什么套餐backupexecBackup Exec 2014怎么备份Exchange
解析域名 双线主机租用 外国服务器 标准机柜尺寸 admit的用法 国外免费asp空间 免费cdn 卡巴斯基破解版 服务器硬件防火墙 智能dns解析 免费asp空间申请 万网空间 lamp架构 阿里云手机官网 实惠 ssl加速 卡巴斯基试用版下载 万网服务器 谷歌搜索打不开 建站论坛 更多