FluentData-新型轻量级ORM 利用T4模板 批量生成多文件 实体和业务逻辑 代码
FluentData,它是一个轻量级框架,关注性能和易用性。
下载地址:FlunenData.Model
利用T4模板,【MultipleOutputHelper.ttinclude】批量生成多文件
基本语法:
1. 初始化:获取MultipleOutputHelper.ttinclude文件模板 在T4模板导入
//导入MultipleOutputHelper.ttinclude文件 路径<#@include file="$(SolutionDir)\ORM.Model\T4\MultipleOutputHelper.ttinclude"#>
.csharpcode, .csharpcode pre { font-size: small; color: rgba(0, 0, 0, 1); font-family: consolas, "Courier New", courier, monospace; background-color: rgba(255, 255, 255, 1) } .csharpcode pre { margin: 0 } .csharpcode .rem { color: rgba(0, 128, 0, 1) } .csharpcode .kwrd { color: rgba(0, 0, 255, 1) } .csharpcode .str { color: rgba(0, 96, 128, 1) } .csharpcode .op { color: rgba(0, 0, 192, 1) } .csharpcode .preproc { color: rgba(204, 102, 51, 1) } .csharpcode .asp { background-color: rgba(255, 255, 0, 1) } .csharpcode .html { color: rgba(128, 0, 0, 1) } .csharpcode .attr { color: rgba(255, 0, 0, 1) } .csharpcode .alt { background-color: rgba(244, 244, 244, 1); width: 100%; margin: 0 } .csharpcode .lnum { color: rgba(96, 96, 96, 1) }
//初始化Manager对象 var manager = Manager.Create(Host, GenerationEnvironment);
.csharpcode, .csharpcode pre { font-size: small; color: rgba(0, 0, 0, 1); font-family: consolas, "Courier New", courier, monospace; background-color: rgba(255, 255, 255, 1) } .csharpcode pre { margin: 0 } .csharpcode .rem { color: rgba(0, 128, 0, 1) } .csharpcode .kwrd { color: rgba(0, 0, 255, 1) } .csharpcode .str { color: rgba(0, 96, 128, 1) } .csharpcode .op { color: rgba(0, 0, 192, 1) } .csharpcode .preproc { color: rgba(204, 102, 51, 1) } .csharpcode .asp { background-color: rgba(255, 255, 0, 1) } .csharpcode .html { color: rgba(128, 0, 0, 1) } .csharpcode .attr { color: rgba(255, 0, 0, 1) } .csharpcode .alt { background-color: rgba(244, 244, 244, 1); width: 100%; margin: 0 } .csharpcode .lnum { color: rgba(96, 96, 96, 1) } .csharpcode, .csharpcode pre { font-size: small; color: rgba(0, 0, 0, 1); font-family: consolas, "Courier New", courier, monospace; background-color: rgba(255, 255, 255, 1) } .csharpcode pre { margin: 0 } .csharpcode .rem { color: rgba(0, 128, 0, 1) } .csharpcode .kwrd { color: rgba(0, 0, 255, 1) } .csharpcode .str { color: rgba(0, 96, 128, 1) } .csharpcode .op { color: rgba(0, 0, 192, 1) } .csharpcode .preproc { color: rgba(204, 102, 51, 1) } .csharpcode .asp { background-color: rgba(255, 255, 0, 1) } .csharpcode .html { color: rgba(128, 0, 0, 1) } .csharpcode .attr { color: rgba(255, 0, 0, 1) } .csharpcode .alt { background-color: rgba(244, 244, 244, 1); width: 100%; margin: 0 } .csharpcode .lnum { color: rgba(96, 96, 96, 1) }
2.文件块:使用代码标识区分生成的代码块的范围
manager.StartNewFile(tb_name+".cs"); //代码块
manager.EndBlock();
.csharpcode, .csharpcode pre { font-size: small; color: rgba(0, 0, 0, 1); font-family: consolas, "Courier New", courier, monospace; background-color: rgba(255, 255, 255, 1) } .csharpcode pre { margin: 0 } .csharpcode .rem { color: rgba(0, 128, 0, 1) } .csharpcode .kwrd { color: rgba(0, 0, 255, 1) } .csharpcode .str { color: rgba(0, 96, 128, 1) } .csharpcode .op { color: rgba(0, 0, 192, 1) } .csharpcode .preproc { color: rgba(204, 102, 51, 1) } .csharpcode .asp { background-color: rgba(255, 255, 0, 1) } .csharpcode .html { color: rgba(128, 0, 0, 1) } .csharpcode .attr { color: rgba(255, 0, 0, 1) } .csharpcode .alt { background-color: rgba(244, 244, 244, 1); width: 100%; margin: 0 } .csharpcode .lnum { color: rgba(96, 96, 96, 1) }
3.编译执行:使用Process方法,进行文件分割
manager.Process(true);
.csharpcode, .csharpcode pre { font-size: small; color: rgba(0, 0, 0, 1); font-family: consolas, "Courier New", courier, monospace; background-color: rgba(255, 255, 255, 1) } .csharpcode pre { margin: 0 } .csharpcode .rem { color: rgba(0, 128, 0, 1) } .csharpcode .kwrd { color: rgba(0, 0, 255, 1) } .csharpcode .str { color: rgba(0, 96, 128, 1) } .csharpcode .op { color: rgba(0, 0, 192, 1) } .csharpcode .preproc { color: rgba(204, 102, 51, 1) } .csharpcode .asp { background-color: rgba(255, 255, 0, 1) } .csharpcode .html { color: rgba(128, 0, 0, 1) } .csharpcode .attr { color: rgba(255, 0, 0, 1) } .csharpcode .alt { background-color: rgba(244, 244, 244, 1); width: 100%; margin: 0 } .csharpcode .lnum { color: rgba(96, 96, 96, 1) }
实践:
1.批量生成实体类
<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ assembly name="System.Data" #>
<#@ assembly name="System.xml" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Data.SqlClient" #>
<#@ import namespace="System.Data" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>// 导入MultipleOutputHelper.ttinclude文件
<#@include file="$(SolutionDir)\My.Model\T4\MultipleOutputHelper.ttinclude"#> <# string connectionString= "server=qq;database=db;uid=sa;pwd=sa;"; SqlConnection conn = new SqlConnection(connectionString);conn.Open();string selectQuery ="SET FMTONLY ON; select * from @tableName; SET FMTONLY OFF;";SqlCommand command = new SqlCommand(selectQuery,conn);SqlDataAdapter ad = new SqlDataAdapter(command);System.Data.DataSet ds = new DataSet(); var manager = Manager.Create(Host, GenerationEnvironment); System.Data.DataTable schema = conn.GetSchema("Tables");foreach(System.Data.DataRow row in schema.Rows){ ds.Tables.Clear();string tb_name= row["TABLE_NAME"].ToString(); command.CommandText = selectQuery.Replace("@tableName",row["TABLE_NAME"].ToString());ad.FillSchema(ds, SchemaType.Mapped,tb_name); manager.StartNewFile(tb_name+".cs");#>using FluentData;
using System;
using System.Collections.Generic;
namespace My.Model
{ /// <summary>/// 实体-<#=tb_name#> /// </summary>public partial class <#=tb_name#> { <#PushIndent(" ");foreach (DataColumn dc in ds.Tables[0].Columns) {WriteLine("public " + dc.DataType.Name+ (dc.AllowDBNull && dc.DataType.Name.ToLower() != "string" ? "? ": " ") + dc.ColumnName + " { get; set; }");}PopIndent();#>}
}<#manager.EndBlock(); } conn.Close(); manager.Process(true); #>
2.批量生成基础业务逻辑
<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ assembly name="System.Data" #>
<#@ assembly name="System.xml" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Data.SqlClient" #>
<#@ import namespace="System.Data" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>// 导入MultipleOutputHelper.ttinclude文件
<#@include file="$(SolutionDir)\MY.Model\T4\MultipleOutputHelper.ttinclude"#> <# string connectionString= "server=QQ;database=DB;uid=sa;pwd=sa;"; SqlConnection conn = new SqlConnection(connectionString);conn.Open();string selectQuery ="SET FMTONLY ON; select * from @tableName; SET FMTONLY OFF;";SqlCommand command = new SqlCommand(selectQuery,conn);SqlDataAdapter ad = new SqlDataAdapter(command);System.Data.DataSet ds = new DataSet(); var manager = Manager.Create(Host, GenerationEnvironment); System.Data.DataTable schema = conn.GetSchema("Tables");foreach(System.Data.DataRow row in schema.Rows){ ds.Tables.Clear();string tb_name= row["TABLE_NAME"].ToString(); command.CommandText = selectQuery.Replace("@tableName",row["TABLE_NAME"].ToString());ad.FillSchema(ds, SchemaType.Mapped,tb_name); manager.StartNewFile(tb_name+"Action.cs");#>using System;
using System.Collections.Generic;
using MY.Model;
using FluentData;
namespace MY.BLL
{ /// <summary>/// <#=tb_name#> 操作类/// </summary>public partial class <#=tb_name#>Action{<#string fkQuery = " SELECT f.name AS ForeignKey,";fkQuery += " OBJECT_NAME(f.parent_object_id) AS TableName, ";fkQuery += " COL_NAME(fc.parent_object_id, fc.parent_column_id) AS ColumnName, ";fkQuery += " OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName, ";fkQuery += " COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS ReferenceColumnName ";fkQuery += " FROM ";fkQuery += " sys.foreign_keys AS f ";fkQuery += " INNER JOIN sys.foreign_key_columns AS fc ON f.OBJECT_ID = fc.constraint_object_id ";fkQuery += " where OBJECT_NAME(f.parent_object_id) = '" +tb_name +"'";List<string> fkColumnNames = new List<string>();Dictionary<string, string> parentTables = new Dictionary<string, string>();SqlCommand command2 = new SqlCommand(fkQuery,conn);using(var dr = command2.ExecuteReader()){while(dr.Read()){fkColumnNames.Add(dr["ColumnName"].ToString());parentTables.Add(dr["ColumnName"].ToString(), dr["ReferenceTableName"].ToString());}dr.Close();}List<DataColumn> fkColumns = new List<DataColumn>();foreach(string fkColumnName in fkColumnNames){foreach (DataColumn dc in ds.Tables[0].Columns) {if(dc.ColumnName == fkColumnName)fkColumns.Add(dc);}}List<string> primaryKeyParamsWithTypes = new List<string>();List<string> primaryKeyParams = new List<string>();List<string> whereItems = new List<string>();List<string> automapItems = new List<string>();foreach(DataColumn pk in ds.Tables[0].PrimaryKey){primaryKeyParamsWithTypes.Add(string.Format("{0} {1}", pk.DataType.Name, this.ToCamelCase(pk.ColumnName)));primaryKeyParams.Add(pk.ColumnName);whereItems.Add(string.Format("{0} = @{1}", pk.ColumnName, pk.ColumnName.ToLower()));automapItems.Add(string.Format("x.{0}", pk.ColumnName));}string updateAutomap = string.Empty;if(automapItems.Count > 0){if(automapItems.Count > 1)updateAutomap = "new { " + string.Join(", ", automapItems.ToArray()) + " }";elseupdateAutomap = automapItems[0];}#>public static <#=tb_name#> Select(<#=string.Join(", ", primaryKeyParamsWithTypes.ToArray())#>){using(var context = db.Context()){return context.Sql(" SELECT * FROM <#=tb_name#> WHERE <#=string.Join(" AND ", whereItems.ToArray())#> ")<#foreach(string pkp in primaryKeyParams) {WriteLine(".Parameter(\"" + pkp.ToLower() + "\", " + this.ToCamelCase(pkp) + ")");}#>.QuerySingle<<#=tb_name#>>();}}public static List<<#=tb_name#>> SelectAll(){return SelectAll(string.Empty);}public static List<<#=tb_name#>> SelectAll(string sortExpression){return SelectAll(0, 0, sortExpression);}public static List<<#=tb_name#>> SelectAll(int startRowIndex, int maximumRows, string sortExpression){using (var context = db.Context()){var select = context.Select<<#=tb_name#>>(" * ").From(" <#=tb_name#> ");if (maximumRows > 0){if (startRowIndex == 0) startRowIndex = 1;select.Paging(startRowIndex, maximumRows);}if (!string.IsNullOrEmpty(sortExpression))select.OrderBy(sortExpression);return select.QueryMany();}}public static int CountAll(){using (var context = db.Context()){return context.Sql(" SELECT COUNT(*) FROM <#=tb_name#> ").QuerySingle<int>();}}<#foreach(DataColumn dc in fkColumns){#>public static List<<#=tb_name#>> SelectBy<#=parentTables[dc.ColumnName]#>(<#=dc.DataType.Name#> <#=this.ToCamelCase(dc.ColumnName)#>){return SelectBy<#=parentTables[dc.ColumnName]#>(<#=this.ToCamelCase(dc.ColumnName)#>, string.Empty);}public static List<<#=tb_name#>> SelectBy<#=parentTables[dc.ColumnName]#>(<#=dc.DataType.Name#> <#=this.ToCamelCase(dc.ColumnName)#>, string sortExpression){return SelectBy<#=parentTables[dc.ColumnName]#>(<#=this.ToCamelCase(dc.ColumnName)#>, 0, 0, sortExpression);}public static List<<#=tb_name#>> SelectBy<#=parentTables[dc.ColumnName]#>(<#=dc.DataType.Name#> <#=this.ToCamelCase(dc.ColumnName)#>, int startRowIndex, int maximumRows, string sortExpression){using (var context = db.Context()){var select = context.Select<<#=tb_name#>>(" * ").From(" <#=tb_name#> ").Where(" <#=dc.ColumnName#> = @<#=dc.ColumnName.ToLower()#> ").Parameter("<#=dc.ColumnName.ToLower()#>", <#=this.ToCamelCase(dc.ColumnName)#>);if (maximumRows > 0){if (startRowIndex == 0) startRowIndex = 1;select.Paging(startRowIndex, maximumRows);}if (!string.IsNullOrEmpty(sortExpression))select.OrderBy(sortExpression);return select.QueryMany();}}public static int CountBy<#=parentTables[dc.ColumnName]#>(<#=dc.DataType.Name#> <#=this.ToCamelCase(dc.ColumnName)#>){using (var context = db.Context()){return context.Sql(" SELECT COUNT(*) FROM <#=tb_name#> WHERE <#=dc.ColumnName#> = @<#=dc.ColumnName.ToLower()#>").Parameter("<#=dc.ColumnName.ToLower()#>", <#=this.ToCamelCase(dc.ColumnName)#>).QuerySingle<int>();}}<#}#><#if(ds.Tables[0].PrimaryKey != null && ds.Tables[0].PrimaryKey.Length == 1 && ds.Tables[0].PrimaryKey[0].AutoIncrement) {#>public static bool Insert(<#=tb_name#> <#=this.ToCamelCase(tb_name)#>) {using (var context = db.Context()){int id = context.Insert<<#=tb_name#>>("<#=tb_name#>", <#=this.ToCamelCase(tb_name)#>).AutoMap(x => x.<#=primaryKeyParams[0]#>).ExecuteReturnLastId<int>();<#=this.ToCamelCase(tb_name)#>.<#=primaryKeyParams[0]#> = id;return id > 0;}}
<#
}
else
{
#>public static bool Insert(<#=tb_name#> <#=this.ToCamelCase(tb_name)#>) {using (var context =db.Context()){return context.Insert<<#=tb_name#>>("<#=tb_name#>", <#=this.ToCamelCase(tb_name)#>).Execute() > 0;}}
<#}#>public static bool Update(<#=tb_name#> <#=this.ToCamelCase(tb_name)#>){using (var context = db.Context()){return context.Update<<#=tb_name#>>("<#=tb_name#>", <#=this.ToCamelCase(tb_name)#>).AutoMap(x => <#=updateAutomap#>)<#foreach(string pkp in primaryKeyParams){#>.Where("<#=pkp#>", <#=this.ToCamelCase(tb_name)#>.<#=pkp#>)<#}#>.Execute() > 0;}}public static bool Delete(<#=tb_name#> <#=this.ToCamelCase(tb_name)#>) {return Delete(<#=string.Join(", ", primaryKeyParams.Select(x=> this.ToCamelCase(tb_name) + "." + x).ToArray())#>);}public static bool Delete(<#=string.Join(", ", primaryKeyParamsWithTypes.ToArray())#>){using (var context = db.Context()){return context.Sql(" DELETE FROM Product WHERE <#=string.Join(" AND ", whereItems.ToArray())#> ")<#foreach(string pkp in primaryKeyParams) {WriteLine(".Parameter(\"" + pkp.ToLower() + "\", " + this.ToCamelCase(pkp) + ")");}#>.Execute() > 0;}}}}<#manager.EndBlock(); } conn.Close(); manager.Process(true); #> <#+public string ToCamelCase(string value){if(string.IsNullOrEmpty(value)) return string.Empty;string firstLetter = value.Substring(0, 1);string rest = value.Substring(1, value.Length - 1);return firstLetter.ToLower() + rest;}
#>
.csharpcode, .csharpcode pre { font-size: small; color: rgba(0, 0, 0, 1); font-family: consolas, "Courier New", courier, monospace; background-color: rgba(255, 255, 255, 1) } .csharpcode pre { margin: 0 } .csharpcode .rem { color: rgba(0, 128, 0, 1) } .csharpcode .kwrd { color: rgba(0, 0, 255, 1) } .csharpcode .str { color: rgba(0, 96, 128, 1) } .csharpcode .op { color: rgba(0, 0, 192, 1) } .csharpcode .preproc { color: rgba(204, 102, 51, 1) } .csharpcode .asp { background-color: rgba(255, 255, 0, 1) } .csharpcode .html { color: rgba(128, 0, 0, 1) } .csharpcode .attr { color: rgba(255, 0, 0, 1) } .csharpcode .alt { background-color: rgba(244, 244, 244, 1); width: 100%; margin: 0 } .csharpcode .lnum { color: rgba(96, 96, 96, 1) }
CTRL+S 自动生成
下载地址:FlunenData.Model
完成!即可快速开发了!
FluentData-新型轻量级ORM 利用T4模板 批量生成多文件 实体和业务逻辑 代码相关推荐
- 【收藏】Python利用Excel+模板批量生成word文件
Python利用Excel+模板批量生成word文件 最近帮朋友批量生成小区业主物业费未缴的律师函.朋友那有物业那边的表格数据,包括楼栋-房间号.业主姓名.欠费日期.欠款金额等信息.目的是需要将这些表 ...
- [转]使用T4模板批量生成代码
本文转自:http://www.cnblogs.com/K_tommy/archive/2013/04/06/T4.html 前言 之前在 "使用T4模板生成代码 - 初探" 文章 ...
- 艺赛旗(PRA)根据制式模板批量生成 word 文件
艺赛旗 RPA8.0全新首发免费下载 点击下载 http://www.i-search.com.cn/index.html?from=line1 请看程序运行过程: 操作 word 其实是一件很痛苦的 ...
- 按模板批量生成Word文件(上)
假设你的公司作为一项大型交流会议的主办方之一,需要邀请其他公司机构的人员出席活动,参会人员有上千名,他们的姓名和联系方式由各公司汇总后储存在不同Excel表格中. 现在要将所有嘉宾信息汇总到一张大表, ...
- Python 自动化:根据模板批量生成含指定数据的 word 文档
作者:一只河马h 来源:简说Python 一.需求说明 在平时工作当中,经常需要处理文件,特别是Word,处理Word时会遇一类比较常见的场景:文档中大部分文字固定不变,小部分内容需要修改. 这时我们 ...
- Python自动化:根据模板批量生成含指定数据的word文档
一.需求说明 在平时工作当中,经常需要处理文件,特别是Word,处理Word时会遇一类比较常见的场景:文档中大部分文字固定不变,小部分内容需要修改. 这时我们会机械的重复打开.修改.保存文档等一系列操 ...
- Excel转Word,Excel导出Word,利用Excel表批量生成Word文档,邮件合并进阶版
单击播放视频教材 利用Excel数据批量生成Word文档升级版,Excel转W 01需求概述 假设有图1所示的数据,需要批量生成WORD成绩通知单,通知单必须遵循图2的样式. (案例中的姓名.学校名称 ...
- T4模板:MVC中用T4模板快速生成代码
T4模板快速生成代码: 以快速生Dal文件为例,下面为T4模板文件的内容 <#@ template debug="false" hostspecific="true ...
- Java中利用freemarker模板动态生成word含表格
最近公司有导出word的需求,由于word的样式有的很复杂所以记录一下Java中利用freemarker模板动态生成word含表格,以防以后忘记. 1.word表格的模板 删掉无用的数据留下基础的样式 ...
最新文章
- 面向未来的智能硬件:研究通用高端智能控制器开发智能体系结构
- UA PHYS515A 电磁理论V 电磁波与辐射1 电磁波的方程
- git和码云的使用以及搭建git服务器
- 洛谷——P1071 潜伏者
- 前端学习(2757):text基本使用
- 在CSS中clear属性的妙用
- 最大似然估计_机器学习最大似然估计
- 从Jira到GitHub,详解Spring Framework问题跟踪系统的迁移过程
- juc包下四大并发工具
- poj1273最大流初破
- 睡眠障碍,正在“杀死”3亿中国人
- 全国软件工程专业大学排名!你报考的大学排第几?
- 深入探析CAN收发器各项参数
- 福昕阅读器不显示菜单栏和工具栏
- js台阶算法问题(上台阶模拟器)
- 【树形结构】巴基斯坦城市列表 (城市原始数据来自md文件)
- Mysql的索引、视图、触发器、存储过程
- 不用PS,一键生成熊猫头表情包(二)
- 转发至新浪微博、开心网、腾讯微博、人人网代码分享!
- Java (过河卒)
热门文章
- 探讨12306两地三中心混合云架构
- 纺织行业MES系统解决方案
- 工业级4G路由器需要满足哪些要求
- 官宣:护眼国际联盟托起明亮视界,护眼事业任重道远
- web前端基础——定位
- 西门子(中国)有限公司
- 用计算机弹出黎明的黑暗,STEAM打开黎明杀机启动游戏后弹出计算机丢失msvcp140period;dllperiod; | 手游网游页游攻略大全...
- JavaScript、jquery将input file的选择的文件清空
- jsp+java自行车租赁租借和买卖系统
- 利用python爬虫自动登录人人网