FluentData-新型轻量级ORM 利用T4模板 批量生成多文件 实体和业务逻辑 代码
FluentData,它是一个轻量级框架,关注性能和易用性。
下载地址:FlunenData.Model
利用T4模板,【MultipleOutputHelper.ttinclude】批量生成多文件
基本语法:
1. 初始化:获取MultipleOutputHelper.ttinclude文件模板 在T4模板导入
//导入MultipleOutputHelper.ttinclude文件 路径
<#@include file="$(SolutionDir)\ORM.Model\T4\MultipleOutputHelper.ttinclude"#>
//初始化Manager对象
var manager = Manager.Create(Host, GenerationEnvironment);
2.文件块:使用代码标识区分生成的代码块的范围
manager.StartNewFile(tb_name+".cs");
//代码块
manager.EndBlock();
3.编译执行:使用Process方法,进行文件分割
manager.Process(true);
实践:

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()) + " }";
else
updateAutomap = 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;
}
#>
CTRL+S 自动生成
下载地址:FlunenData.Model
完成!即可快速开发了!
FluentData-新型轻量级ORM 利用T4模板 批量生成多文件 实体和业务逻辑 代码的更多相关文章
- 【转】- 使用T4模板批量生成代码
前言 之前在 “使用T4模板生成代码 - 初探” 文章简单的使用了T4模板的生成功能,但对于一个模板生成多个实例文件,如何实现这个方式呢?无意发现一个解决方案 “MultipleOutputHelpe ...
- [原创] 利用前端+php批量生成html文件,传入新文本,输出新的html文件
本人因为要想自己写个小说网站练练手,在其中遇到的一些问题,将其解决方法总结出来,例如: 1:小说网站存储了大量的小说,每个小说主页都很相似,url不同,不是使用的history属性改写的,所以如果人工 ...
- T4模板批量生成代码文件
<#@ template debug="false" hostspecific="true" language="C#" #> ...
- T4模板批量生成代码
大家通过比对下,就应该知道怎么玩. T4代码 <#@ template debug="false" hostspecific="true" languag ...
- 利用Resgen.exe 批量生成resources文件
Resgen.exe(资源文件生成器) 您可以直接如图操作 转换时在 文本中先写好要转换的文件然后 全选 复制到控制台中 Filename.resx 要转换的文件 ResName1.resource ...
- PetaPoco T4模板修改生成实体
PetaPoco T4 模板生成的实体类全部包含再一个.CS文件中.通过修改PetaPoco的T4模板,生成单文件实体. 1.生成单CS文件模板: SigleFile.ttinclude <#@ ...
- 【VS外接程序】利用T4模板生成模块代码
引言 记得第一次做asp.net mvc项目时,可以用model直接生成Html的增删改查页面, 没什么特殊要求都可以不用修改直接用了, 觉得很神奇,效率太高了.后来在做客户端开发时,发现很多模块都是 ...
- T4 模板自动生成带注释的实体类文件
T4 模板自动生成带注释的实体类文件 - 只需要一个 SqlSugar.dll 生成实体就是这么简单,只要建一个T4文件和 文件夹里面放一个DLL. 使用T4模板教程 步骤1 创建T4模板 如果你没有 ...
- JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(四):自定义T4模板快速生成页面
前言:上篇介绍了下ko增删改查的封装,确实节省了大量的js代码.博主是一个喜欢偷懒的人,总觉得这些基础的增删改查效果能不能通过一个什么工具直接生成页面效果,啥代码都不用写了,那该多爽.于是研究了下T4 ...
随机推荐
- ZeroMQ接口函数之 :zmq_ipc – ZMQ本地进程间通信传输协议
ZeroMQ API 目录 :http://www.cnblogs.com/fengbohello/p/4230135.html ——————————————————————————————————— ...
- 通过Gulp使用Browsersync实现浏览器实时响应文件更改
Gulp是什么鬼 Browsersync又是什么鬼 如何安装使用Browsersync 安装 使用 效果图 参考 Gulp是什么鬼 Gulp是一种基于node.js的构建工具,有关构建工具的概念请移步 ...
- 浏览器对象模型BOM小结
概念 BOM (Browser Object Model) 浏览器对象模型 BOM提供了独立于内容而与浏览器窗口进行交互的对象 BOM主要用于管理窗口与窗口之间的通讯,因此其核心对象是window B ...
- C++11 auto and decltype
1.auto关键字 C++新标准引入auto关键词,此auto与之前C语言的auto意义已经不一样了. 这里的auto是修饰未知变量的类型,编译器会通过此变量的初始化自动推导变量的类型. 例如:aut ...
- htaccess文件还可以被用来把访问网站的流量劫持到黑客的网站
看是否有文件上传操作(POST方法), IPREMOVED--[01/Mar/2013:06:16:48-0600]"POST/uploads/monthly_10_2012/view.ph ...
- Android课程---关于数据存储的学习(2)
手机外部存储的学习 activity_data2.xml <?xml version="1.0" encoding="utf-8"?> <Li ...
- 一般企业网站,电商可以完全可以水平拓展的lanmp系统架构
本来不打算把所有的架构方案和基础技术写出,毕竟是吃饭的家伙事,拿这套东西去面试完全可以对付只做过中小网站的经验的开发面试人员,但是我也是从别人的博客和文章学习和实践出来的 如果你没有基础的linux一 ...
- EntityFramework Reverse POCO Code First 生成器
功能强大的(免费)实体框架工具 Julie Lerman 实体框架是开源的,因此开发社区可以在 entityframework.codeplex.com 上共享代码. 但是不要将自己局限在那里寻找工具 ...
- AsyncTask内的各个方法调用顺序
|- AsyncTask内的各个方法调用顺序:|- 首先,用户调用execute方法,启动AsyncTask .然后在execute方法中:|- 首先调用onPreExecute方法,执行初始化操作. ...
- (转)struts2:数据校验,通过XWork校验框架实现(validation.xml)
转载自:http://www.cnblogs.com/nayitian/p/3475661.html struts2:数据校验,通过XWork校验框架实现(validation.xml) 根据输入 ...