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模板 批量生成多文件 实体和业务逻辑 代码相关推荐

  1. 【收藏】Python利用Excel+模板批量生成word文件

    Python利用Excel+模板批量生成word文件 最近帮朋友批量生成小区业主物业费未缴的律师函.朋友那有物业那边的表格数据,包括楼栋-房间号.业主姓名.欠费日期.欠款金额等信息.目的是需要将这些表 ...

  2. [转]使用T4模板批量生成代码

    本文转自:http://www.cnblogs.com/K_tommy/archive/2013/04/06/T4.html 前言 之前在 "使用T4模板生成代码 - 初探" 文章 ...

  3. 艺赛旗(PRA)根据制式模板批量生成 word 文件

    艺赛旗 RPA8.0全新首发免费下载 点击下载 http://www.i-search.com.cn/index.html?from=line1 请看程序运行过程: 操作 word 其实是一件很痛苦的 ...

  4. 按模板批量生成Word文件(上)

    假设你的公司作为一项大型交流会议的主办方之一,需要邀请其他公司机构的人员出席活动,参会人员有上千名,他们的姓名和联系方式由各公司汇总后储存在不同Excel表格中. 现在要将所有嘉宾信息汇总到一张大表, ...

  5. Python 自动化:根据模板批量生成含指定数据的 word 文档

    作者:一只河马h 来源:简说Python 一.需求说明 在平时工作当中,经常需要处理文件,特别是Word,处理Word时会遇一类比较常见的场景:文档中大部分文字固定不变,小部分内容需要修改. 这时我们 ...

  6. Python自动化:根据模板批量生成含指定数据的word文档

    一.需求说明 在平时工作当中,经常需要处理文件,特别是Word,处理Word时会遇一类比较常见的场景:文档中大部分文字固定不变,小部分内容需要修改. 这时我们会机械的重复打开.修改.保存文档等一系列操 ...

  7. Excel转Word,Excel导出Word,利用Excel表批量生成Word文档,邮件合并进阶版

    单击播放视频教材 利用Excel数据批量生成Word文档升级版,Excel转W 01需求概述 假设有图1所示的数据,需要批量生成WORD成绩通知单,通知单必须遵循图2的样式. (案例中的姓名.学校名称 ...

  8. T4模板:MVC中用T4模板快速生成代码

    T4模板快速生成代码: 以快速生Dal文件为例,下面为T4模板文件的内容 <#@ template debug="false" hostspecific="true ...

  9. Java中利用freemarker模板动态生成word含表格

    最近公司有导出word的需求,由于word的样式有的很复杂所以记录一下Java中利用freemarker模板动态生成word含表格,以防以后忘记. 1.word表格的模板 删掉无用的数据留下基础的样式 ...

最新文章

  1. 面向未来的智能硬件:研究通用高端智能控制器开发智能体系结构
  2. UA PHYS515A 电磁理论V 电磁波与辐射1 电磁波的方程
  3. git和码云的使用以及搭建git服务器
  4. 洛谷——P1071 潜伏者
  5. 前端学习(2757):text基本使用
  6. 在CSS中clear属性的妙用
  7. 最大似然估计_机器学习最大似然估计
  8. 从Jira到GitHub,详解Spring Framework问题跟踪系统的迁移过程
  9. juc包下四大并发工具
  10. poj1273最大流初破
  11. 睡眠障碍,正在“杀死”3亿中国人
  12. 全国软件工程专业大学排名!你报考的大学排第几?
  13. 深入探析CAN收发器各项参数
  14. 福昕阅读器不显示菜单栏和工具栏
  15. js台阶算法问题(上台阶模拟器)
  16. 【树形结构】巴基斯坦城市列表 (城市原始数据来自md文件)
  17. Mysql的索引、视图、触发器、存储过程
  18. 不用PS,一键生成熊猫头表情包(二)
  19. 转发至新浪微博、开心网、腾讯微博、人人网代码分享!
  20. Java (过河卒)

热门文章

  1. 探讨12306两地三中心混合云架构
  2. 纺织行业MES系统解决方案
  3. 工业级4G路由器需要满足哪些要求
  4. 官宣:护眼国际联盟托起明亮视界,护眼事业任重道远
  5. web前端基础——定位
  6. 西门子(中国)有限公司
  7. 用计算机弹出黎明的黑暗,STEAM打开黎明杀机启动游戏后弹出计算机丢失msvcp140period;dllperiod; | 手游网游页游攻略大全...
  8. JavaScript、jquery将input file的选择的文件清空
  9. jsp+java自行车租赁租借和买卖系统
  10. 利用python爬虫自动登录人人网