NFine框架的T4模板
阅读目录
1.前言
2.NFine.Domain.Entity
3.NFine.Domain.IRepository
4.NFine.Repository
5.NFine.Mapping
6.NFine.Application
7.DbHelper.ttinclude
8.ModelAuto.ttinclude
模板在此下载。
回到顶部
1.前言
前段时间在网上看到一个开源框架很好的。开源:ASP.NETMVC+EF6+Bootstrap开发框架,写代码就是比较比较麻烦,分层比较多,对于我这种偷懒的人就想到了写一个T4模板。不了解框架的可以先去看一下这个开源的框架。
一起有5个层,也就是意味着每次数据库添加一张表,就需要写这5个类。
回到顶部
2.NFine.Domain.Entity
复制代码
<#@templatedebug="false"hostspecific="false"language="C#"#>
<#@outputextension=".cs"#>
<#@assemblyname="System.Core.dll"#>
<#@assemblyname="System.Data.dll"#>
<#@assemblyname="System.Data.DataSetExtensions.dll"#>
<#@assemblyname="System.Xml.dll"#>
<#@importnamespace="System"#>
<#@importnamespace="System.Xml"#>
<#@importnamespace="System.Linq"#>
<#@importnamespace="System.Data"#>
<#@importnamespace="System.Data.SqlClient"#>
<#@importnamespace="System.Collections.Generic"#>
<#@importnamespace="System.IO"#>
<#@includefile="$(ProjectDir)DbHelper.ttinclude"#>
//------------------------------------------------------------------------------
//<博客园-枫伶忆http://www.cnblogs.com/fenglingyi/>
//此代码由T4模板自动生成
//生成时间<#=DateTime.Now.ToString("yyyy-MM-ddHH:mm:ss")#>by枫伶忆
//对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
//QQ:549387177
//<博客园-枫伶忆http://www.cnblogs.com/fenglingyi/>
//------------------------------------------------------------------------------
<#
vartableName=config.TableName.Replace("Sys_","")+"Entity";
#>
usingSystem;
namespaceNFine.Domain.Entity.SystemManage
{
///
///<#=tableName#>
///
publicclass<#=tableName#>:IEntity<<#=tableName#>>,ICreationAudited,IDeleteAudited,IModificationAudited
{
<#foreach(DbColumncolumninDbHelper.GetDbColumns(config.ConnectionString,config.DbDatabase,config.TableName)){#>
public<#=column.CSharpType#><#if(column.CommonType.IsValueType&&column.IsNullable){#>?<#}#><#=column.ColumnName#>{get;set;}
<#}#>
}
}
复制代码
回到顶部
3.NFine.Domain.IRepository
复制代码
<#@templatedebug="false"hostspecific="false"language="C#"#>
<#@outputextension=".cs"#>
<#@assemblyname="System.Core.dll"#>
<#@assemblyname="System.Data.dll"#>
<#@assemblyname="System.Data.DataSetExtensions.dll"#>
<#@assemblyname="System.Xml.dll"#>
<#@importnamespace="System"#>
<#@importnamespace="System.Xml"#>
<#@importnamespace="System.Linq"#>
<#@importnamespace="System.Data"#>
<#@importnamespace="System.Data.SqlClient"#>
<#@importnamespace="System.Collections.Generic"#>
<#@importnamespace="System.IO"#>
<#@includefile="$(ProjectDir)DbHelper.ttinclude"#>
//------------------------------------------------------------------------------
//<博客园-枫伶忆http://www.cnblogs.com/fenglingyi/>
//此代码由T4模板自动生成
//生成时间<#=DateTime.Now.ToString("yyyy-MM-ddHH:mm:ss")#>by枫伶忆
//对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
//QQ:549387177
//<博客园-枫伶忆http://www.cnblogs.com/fenglingyi/>
//------------------------------------------------------------------------------
<#
vartableName=config.TableName.Replace("Sys_","")+"Repository";
varentity=config.TableName.Replace("Sys_","")+"Entity";
#>
usingNFine.Data;
usingNFine.Domain.Entity.SystemManage;
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Threading.Tasks;
namespaceNFine.Domain.IRepository.SystemManage
{
///
///<#=tableName#>
///
publicinterfaceI<#=tableName#>:IRepositoryBase<<#=entity#>>
{
}
}
复制代码
回到顶部
4.NFine.Repository
复制代码
<#@templatedebug="false"hostspecific="false"language="C#"#>
<#@outputextension=".cs"#>
<#@assemblyname="System.Core.dll"#>
<#@assemblyname="System.Data.dll"#>
<#@assemblyname="System.Data.DataSetExtensions.dll"#>
<#@assemblyname="System.Xml.dll"#>
<#@importnamespace="System"#>
<#@importnamespace="System.Xml"#>
<#@importnamespace="System.Linq"#>
<#@importnamespace="System.Data"#>
<#@importnamespace="System.Data.SqlClient"#>
<#@importnamespace="System.Collections.Generic"#>
<#@importnamespace="System.IO"#>
<#@includefile="$(ProjectDir)DbHelper.ttinclude"#>
//------------------------------------------------------------------------------
//<博客园-枫伶忆http://www.cnblogs.com/fenglingyi/>
//此代码由T4模板自动生成
//生成时间<#=DateTime.Now.ToString("yyyy-MM-ddHH:mm:ss")#>by枫伶忆
//对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
//QQ:549387177
//<博客园-枫伶忆http://www.cnblogs.com/fenglingyi/>
//------------------------------------------------------------------------------
<#
vartableName=config.TableName.Replace("Sys_","")+"Repository";
varentity=config.TableName.Replace("Sys_","")+"Entity";
#>
usingNFine.Data;
usingNFine.Domain.Entity.SystemManage;
usingNFine.Domain.IRepository.SystemManage;
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Threading.Tasks;
namespaceNFine.Repository.SystemManage
{
///
///<#=tableName#>
///
publicclass<#=tableName#>:RepositoryBase<<#=entity#>>,I<#=tableName#>
{
}
}
复制代码
回到顶部
5.NFine.Mapping
复制代码
<#@templatedebug="false"hostspecific="false"language="C#"#>
<#@outputextension=".cs"#>
<#@assemblyname="System.Core.dll"#>
<#@assemblyname="System.Data.dll"#>
<#@assemblyname="System.Data.DataSetExtensions.dll"#>
<#@assemblyname="System.Xml.dll"#>
<#@importnamespace="System"#>
<#@importnamespace="System.Xml"#>
<#@importnamespace="System.Linq"#>
<#@importnamespace="System.Data"#>
<#@importnamespace="System.Data.SqlClient"#>
<#@importnamespace="System.Collections.Generic"#>
<#@importnamespace="System.IO"#>
<#@includefile="$(ProjectDir)DbHelper.ttinclude"#>
//------------------------------------------------------------------------------
//<博客园-枫伶忆http://www.cnblogs.com/fenglingyi/>
//此代码由T4模板自动生成
//生成时间<#=DateTime.Now.ToString("yyyy-MM-ddHH:mm:ss")#>by枫伶忆
//对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
//QQ:549387177
//<博客园-枫伶忆http://www.cnblogs.com/fenglingyi/>
//------------------------------------------------------------------------------
<#
vardbTableName=config.TableName;
vartableName=config.TableName.Replace("Sys_","")+"Map";
varentity=config.TableName.Replace("Sys_","")+"Entity";
varlist=DbHelper.GetDbColumns(config.ConnectionString,config.DbDatabase,config.TableName);
varpk=DbHelper.GetPrimaryKey(list);
#>
usingNFine.Domain.Entity.SystemManage;
usingSystem.Data.Entity.ModelConfiguration;
namespaceNFine.Mapping.SystemManage
{
///
///<#=tableName#>
///
publicclass<#=tableName#>:EntityTypeConfiguration<<#=entity#>>
{
public<#=tableName#>()
{
this.ToTable("<#=dbTableName#>");
this.HasKey(t=>t.<#=pk#>);
}
}
}
复制代码
回到顶部
6.NFine.Application
复制代码
<#@templatedebug="false"hostspecific="false"language="C#"#>
<#@outputextension=".cs"#>
<#@assemblyname="System.Core.dll"#>
<#@assemblyname="System.Data.dll"#>
<#@assemblyname="System.Data.DataSetExtensions.dll"#>
<#@assemblyname="System.Xml.dll"#>
<#@importnamespace="System"#>
<#@importnamespace="System.Xml"#>
<#@importnamespace="System.Linq"#>
<#@importnamespace="System.Data"#>
<#@importnamespace="System.Data.SqlClient"#>
<#@importnamespace="System.Collections.Generic"#>
<#@importnamespace="System.IO"#>
<#@includefile="$(ProjectDir)DbHelper.ttinclude"#>
//------------------------------------------------------------------------------
//<博客园-枫伶忆http://www.cnblogs.com/fenglingyi/>
//此代码由T4模板自动生成
//生成时间<#=DateTime.Now.ToString("yyyy-MM-ddHH:mm:ss")#>by枫伶忆
//对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
//QQ:549387177
//<博客园-枫伶忆http://www.cnblogs.com/fenglingyi/>
//------------------------------------------------------------------------------
<#
vartableName=config.TableName.Replace("Sys_","")+"App";
varentity=config.TableName.Replace("Sys_","")+"Entity";
varrepository=config.TableName.Replace("Sys_","")+"Repository";
#>
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingNFine.Domain.Entity.SystemManage;
usingNFine.Domain.IRepository.SystemManage;
usingNFine.Repository.SystemManage;
namespaceNFine.Application.SystemManage
{
///
///<#=tableName#>
///
publicclass<#=tableName#>
{
privateI<#=repository#>service=new<#=repository#>();
publicList<<#=entity#>>GetList()
{
returnservice.IQueryable().ToList();
}
public<#=entity#>GetForm(stringkeyValue)
{
returnservice.FindEntity(keyValue);
}
publicvoidDelete(<#=entity#>entity)
{
service.Delete(entity);
}
publicvoidSubmitForm(<#=entity#>entity,stringkeyValue)
{
if(!string.IsNullOrEmpty(keyValue))
{
entity.Modify(keyValue);
service.Update(entity);
}
else
{
entity.Create();
service.Insert(entity);
}
}
}
}
复制代码
回到顶部
7.DbHelper.ttinclude
核心的帮助类
复制代码
<#+
publicclassDbHelper
{
#regionGetDbTables
publicstaticListGetDbTables(stringconnectionString,stringdatabase,stringtables=null)
{
if(!string.IsNullOrEmpty(tables))
{
tables=string.Format("andobj.namein(''{0}'')",tables.Replace(",","'',''"));
}
#regionSQL
stringsql=string.Format(@"SELECT
obj.nametablename,
schem.nameschemname,
idx.rows,
CAST
(
CASE
WHEN(SELECTCOUNT(1)FROMsys.indexesWHEREobject_id=obj.OBJECT_IDANDis_primary_key=1)>=1THEN1
ELSE0
END
ASBIT)HasPrimaryKey
from{0}.sys.objectsobj
innerjoin{0}.dbo.sysindexesidxonobj.object_id=idx.idandidx.indid<=1
INNERJOIN{0}.sys.schemasschemONobj.schema_id=schem.schema_id
wheretype=''U''{1}
orderbyobj.name",database,tables);
#endregion
DataTabledt=GetDataTable(connectionString,sql);
returndt.Rows.Cast().Select(row=>newDbTable
{
TableName=row.Field("tablename"),
SchemaName=row.Field("schemname"),
Rows=row.Field("rows"),
HasPrimaryKey=row.Field("HasPrimaryKey")
}).ToList();
}
#endregion
#regionGetDbColumns
publicstaticListGetDbColumns(stringconnectionString,stringdatabase,stringtableName,stringschema="dbo")
{
#regionSQL
stringsql=string.Format(@"
WITHindexCTEAS
(
SELECT
ic.column_id,
ic.index_column_id,
ic.object_id
FROM{0}.sys.indexesidx
INNERJOIN{0}.sys.index_columnsicONidx.index_id=ic.index_idANDidx.object_id=ic.object_id
WHEREidx.object_id=OBJECT_ID(@tableName)ANDidx.is_primary_key=1
)
select
colm.column_idColumnID,
CAST(CASEWHENindexCTE.column_idISNULLTHEN0ELSE1ENDASBIT)IsPrimaryKey,
colm.nameColumnName,
systype.nameColumnType,
colm.is_identityIsIdentity,
colm.is_nullableIsNullable,
cast(colm.max_lengthasint)ByteLength,
(
case
whensystype.name=''nvarchar''andcolm.max_length>0thencolm.max_length/2
whensystype.name=''nchar''andcolm.max_length>0thencolm.max_length/2
whensystype.name=''ntext''andcolm.max_length>0thencolm.max_length/2
elsecolm.max_length
end
)CharLength,
cast(colm.precisionasint)Precision,
cast(colm.scaleasint)Scale,
prop.valueRemark
from{0}.sys.columnscolm
innerjoin{0}.sys.typessystypeoncolm.system_type_id=systype.system_type_idandcolm.user_type_id=systype.user_type_id
leftjoin{0}.sys.extended_propertiesproponcolm.object_id=prop.major_idandcolm.column_id=prop.minor_id
LEFTJOINindexCTEONcolm.column_id=indexCTE.column_idANDcolm.object_id=indexCTE.object_id
wherecolm.object_id=OBJECT_ID(@tableName)
orderbycolm.column_id",database);
#endregion
SqlParameterparam=newSqlParameter("@tableName",SqlDbType.NVarChar,100){Value=string.Format("{0}.{1}.{2}",database,schema,tableName)};
DataTabledt=GetDataTablewww.baiyuewang.net(connectionString,sql,param);
returndt.Rows.Cast().Select(row=>newDbColumn()
{
ColumnID=row.Field("ColumnID"),
IsPrimaryKey=row.Field("IsPrimaryKey"),
ColumnName=row.Field("ColumnName"),
ColumnType=row.Field("ColumnType"),
IsIdentity=row.Field("IsIdentity"),
IsNullable=row.Field("IsNullable"),
ByteLength=row.Field("ByteLength"),
CharLength=row.Field("CharLength"),
Scale=row.Field("Scale"),
Remark=row["Remark"].ToString()
}).ToList();
}
#endregion
#regionGetDataTable
publicstaticDataTableGetDataTable(stringconnectionString,stringcommandText,paramsSqlParameter[]parms)
{
using(SqlConnectionconnection=newSqlConnection(connectionString))
{
SqlCommandcommand=connection.CreateCommand();
command.CommandText=commandText;
command.Parameters.AddRange(parms);
SqlDataAdapteradapter=newSqlDataAdapter(command);
DataTabledt=newDataTable();
adapter.Fill(dt);
returndt;
}
}
#endregion
#regionGetPrimaryKey
publicstaticstringGetPrimaryKey(ListdbColumns)
{
stringprimaryKey=string.Empty;
if(dbColumns!=null&&dbColumns.Count>0)
{
foreach(varitemindbColumns)
{
if(item.IsPrimaryKey==true)
{
primaryKey=item.ColumnName;
}
}
}
returnprimaryKey;
}
#endregion
}
#regionDbTable
///
///表结构
///
publicsealedclassDbTable
{
///
///表名称
///
publicstringTableName{get;set;}
///
///表的架构
///
publicstringSchemaName{get;set;}
///
///表的记录数
///
publicintRows{get;set;}
///
///是否含有主键
///
publicboolHasPrimaryKey{get;set;}
}
#endregion
#regionDbColumn
///
///表字段结构
///
publicsealedclassDbColumn
{
///
///字段ID
///
publicintColumnID{get;set;}
///
///是否主键
///
publicboolIsPrimaryKey{get;set;}
///
///字段名称
///
publicstringColumnName{get;set;}
///
///字段类型
///
publicstringColumnType{get;set;}
///
///数据库类型对应的C#类型
///
publicstringCSharpType
{
get
{
returnSqlServerDbTypeMap.MapCsharpType(ColumnType);
}
}
///
///
///
publicTypeCommonType
{
get
{
returnSqlServerDbTypeMap.MapCommonType(ColumnType);
}
}
///
///字节长度
///
publicintByteLength{get;set;}
///
///字符长度
///
publicintCharLength{get;set;}
///
///小数位
///
publicintScale{get;set;}
///
///是否自增列
///
publicboolIsIdentity{get;set;}
///
///是否允许空
///
publicboolIsNullable{get;set;}
///
///描述
///
publicstringRemark{get;set;}
}
#endregion
#regionSqlServerDbTypeMap
publicclassSqlServerDbTypeMap
{
publicstaticstringMapCsharpType(stringdbtype)
{
if(string.IsNullOrEmpty(dbtype))returndbtype;
dbtype=dbtype.ToLower();
stringcsharpType="object";
switch(dbtype)
{
case"bigint":csharpType="long";break;
case"binary":csharpType="byte[]";break;
case"bit":csharpType="bool";break;
case"char":csharpType="string";break;
case"date":csharpType="DateTime";break;
case"datetime":csharpType="DateTime";break;
case"datetime2":csharpType="DateTime";break;
case"datetimeoffset":csharpType="DateTimeOffset";break;
case"decimal":csharpType="decimal";break;
case"float":csharpType="double";break;
case"image":csharpType="byte[]";break;
case"int":csharpType="int";break;
case"money":csharpType="decimal";break;
case"nchar":csharpType="string";break;
case"ntext":csharpType="string";break;
case"numeric":csharpType="decimal";break;
case"nvarchar":csharpType="string";break;
case"real":csharpType="Single";break;
case"smalldatetime":csharpType="DateTime";break;
case"smallint":csharpType="short";break;
case"smallmoney":csharpType="decimal";break;
case"sql_variant":csharpType="object";break;
case"sysname":csharpType="object";break;
case"text":csharpType="string";break;
case"time":csharpType="TimeSpan";break;
case"timestamp":csharpType="byte[]";break;
case"tinyint":csharpType="byte";break;
case"uniqueidentifier":csharpType="Guid";break;
case"varbinary":csharpType="byte[]";break;
case"varchar":csharpType="string";break;
case"xml":csharpType="string";break;
default:csharpType="object";break;
}
returncsharpType;
}
publicstaticTypeMapCommonType(stringdbtype)
{
if(string.IsNullOrEmpty(dbtype))returnType.Missing.GetType();
dbtype=dbtype.ToLower();
TypecommonType=typeof(object);
switch(dbtype)
{
case"bigint":commonType=typeof(long);break;
case"binary":commonType=typeof(byte[]);break;
case"bit":commonType=typeof(bool);break;
case"char":commonType=typeof(string);break;
case"date":commonType=typeof(DateTime);break;
case"datetime":commonType=typeof(DateTime);break;
case"datetime2":commonType=typeof(DateTime);break;
case"datetimeoffset":commonType=typeof(DateTimeOffset);break;
case"decimal":commonType=typeof(decimal);break;
case"float":commonType=typeof(double);break;
case"image":commonType=typeof(byte[]);break;
case"int":commonType=typeof(int);break;
case"money":commonType=typeof(decimal);break;
case"nchar":commonType=typeof(string);break;
case"ntext":commonType=typeof(string);break;
case"numeric":commonType=typeof(decimal);break;
case"nvarchar":commonType=typeof(string);break;
case"real":commonType=typeof(Single);break;
case"smalldatetime":commonType=typeof(DateTime);break;
case"smallint":commonType=typeof(short);break;
case"smallmoney":commonType=typeof(decimal);break;
case"sql_variant":commonType=typeof(object);break;
case"sysname":commonType=typeof(object);break;
case"text"www.wang027.com:commonType=typeof(string);break;
case"time":commonType=typeof(TimeSpan);break;
case"timestamp":commonType=typeof(byte[]);break;
case"tinyint":commonType=typeof(byte);break;
case"uniqueidentifier":commonType=typeof(Guid);break;
case"varbinary":commonType=typeof(byte[]);break;
case"varchar":commonType=typeof(string);break;
case"xml":commonType=typeof(string);break;
default:commonType=typeof(object);break;
}
returncommonType;
}
}
#endregion
#>
<#+
publicclassconfig
{
publicstaticreadonlystringConnectionString="DataSource=(local);InitialCatalog=NFineBase;UserID=sa;Password=hjf19870810;";
publicstaticreadonlystringDbDatabase="NFineBase";
publicstaticreadonlystringTableName="Sys_Test";
}
#>
|
|