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 ...
随机推荐
- linux shell trap的使用
原文地址:http://blog.sina.com.cn/s/blog_62eb16bb01014dbh.html 一. trap捕捉到信号之后,可以有三种反应方式: (1)执行一段程序来处理这一信号 ...
- Maya Plugin 编译Maya插件
Maya自身的功能就已经非常强大了,但是更棒的是它的扩展性非常强,提供API让用户自己来编写插件Plugin.Maya的插件主要是两种,一种是用C++编写的,后缀为".mll",另 ...
- 安装phonegap3.2
安装phonegap3.2,要用node.js,还要安装git
- Linux下配置一个VNC服务器
在Linux下配置一个VNC服务器,并设置2个用户,要求其中一个用户登录时不需要输入密码. 然后在客户端使用ssh+vncview的方式访问. 1确认vnc安装 2配置vncserver 3测试vnc ...
- hibernate_Restrictions用法
方法 说明 Restrictions.eq = Restrictions.allEq 利用Map来进行多个等于的限制 Restrictions.gt > Restrictions.ge &g ...
- windows计划任务+批处理文件实现oracle数据库的定时备份与恢复
1. 备份: PS:2014-1-15 如果导出的dmp数据文件不大的话,就直接每天导出好了,不要只保存七天的数据.然后顶起通过winrar对文件进行打包,我发现dmp文件的压缩包还是很高的. 那么 ...
- github搭建静态博客
p { margin-bottom: 0.1in; line-height: 120% } 1. 创建Repository 创建一个与自己github用户名对应的Repository,例如:abc.g ...
- jQuery File Upload 单页面多实例的实现
jQuery File Upload 的 GitHub 地址:https://github.com/blueimp/jQuery-File-Upload 插件描述:jQuery File Upload ...
- partnerv2.1
2.1.实时获取产品价格(action=queryprice) 请求 { "useDate": "2016-04-05T19:56", //开始用车时间(当地时 ...
- CSS基础1
CSS是层叠样式表(Cascading Style Sheets)的缩写,它有以下优点:①提高页面浏览速度:②缩短改版时间,降低维护费用:③更好的控制页面布局:④实现表现和结构.内容相分离:⑤更方便搜 ...