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 ...
随机推荐
- List集合特有的迭代器 ListIterator
- CI框架3
1.CI不能像smarty那样直接{}访问, <?php echo $ci;?> application\config\ config.php 日志查看 $config['lo ...
- 使用XML文件记录操作日志,并从后往前读取操作日志并在richTextBox1控件中显示出来
#region 获取本地程序操作记录日志 /// <summary> /// 获取本地程序更新日志信息(由后往前读取) /// </summary> private void ...
- C++标准库 -- tuple
头文件:<tuple> 可访问属性: 无(用get方法来访问数据) 可访问方法: swap(tuple) 和另外一个tuple交换值 其他相关方法: swap(t1, t2) 交换两个tu ...
- Volley
Volley 是 Google 推出的轻量级 Android 异步网络请求框架和图片加载框架.在 Google I/O 2013 大会上发布.其适用场景是数据量小,通信频繁的网络操作. 主要特点: ( ...
- can't resolve symbol 'R' ...
in android studio IDE: 解决: Tools -> Android -> Sync Project with Gradle Files
- true_kb
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- php_cz
post.php <?php require_once 'config.php'; $ddh=trim(htmlspecialchars($_POST['ddh'])); //支付宝交易号 $m ...
- 一起来做chrome扩展《本地存储localStorage》
chrome中的本地存储其实也是用的HTML5中localStorage,唯一区别是chrome扩展有自己的localStorage,它属于这个扩展,而不属于一个域名.得用这一点可以很好的处理扩展自己 ...
- 响应链和UIKit框架
Event Delivery: The Responder Chain When you design your app, it’s likely that you want to respond t ...