http://www.cnblogs.com/zengxiangzhan/p/3250105.html

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,它是一个轻量级框架,关注性能和易用性。的更多相关文章

  1. 如何评价一个RPC框架的性能

    协议:数据传输的格式,通信双方的契约.   传输:使用何种传输通道传输数据.   线程:接收到数据,如何分发数据进行处理.

  2. FluentData,一个轻量级开源的.NET ORM数据持久化框架

    FluentData:一种使用Fluent API的新型轻量级ORM模型  FluentData 是微型 ORM(micro-ORM)家族的一名新成员,旨在比大型 ORM(full ORM)更加易用. ...

  3. 初步了解学习flask轻量级框架,

    关于flask我有话说 flask作为一个轻量级框架,它里面有好多扩展包需要下载,比较麻烦,而且有的时候flask需要在虚拟环境下运行,但是他的优点还是有滴 ,只要是用过Django的人,都会觉得fl ...

  4. 一个轻量级分布式RPC框架--NettyRpc

    1.背景 最近在搜索Netty和Zookeeper方面的文章时,看到了这篇文章<轻量级分布式 RPC 框架>,作者用Zookeeper.Netty和Spring写了一个轻量级的分布式RPC ...

  5. C++11实现一个轻量级的AOP框架

    AOP介绍 AOP(Aspect-Oriented Programming,面向方面编程),可以解决面向对象编程中的一些问题,是OOP的一种有益补充.面向对象编程中的继承是一种从上而下的关系,不适合定 ...

  6. 一个轻量级分布式 RPC 框架 — NettyRpc

    原文出处: 阿凡卢 1.背景 最近在搜索Netty和Zookeeper方面的文章时,看到了这篇文章<轻量级分布式 RPC 框架>,作者用Zookeeper.Netty和Spring写了一个 ...

  7. 如何在Java生态圈选择一个轻量级的RESTful框架?

    在微服务流行的今天,我们会从纵向和横向分解代码的逻辑,将一些独立的无状态的代码单元实现为微服务,可以将它们发布到一些分布式计算单元或者Docker中,并在性能需要的时候及时地创建更多的服务单元.微服务 ...

  8. 基于Netty和SpringBoot实现一个轻量级RPC框架-Server篇

    前提 前置文章: Github Page:<基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇> Coding Page:<基于Netty和SpringBoot实现 ...

  9. Objection, 一个轻量级的Objective-C依赖注入框架

    简介 项目主页:https://github.com/atomicobject/objection 实例下载: https://github.com/ios122/ios122 Objection 是 ...

随机推荐

  1. javascript替换手机号中间4位

    // 匹配手机号首尾,以类似“123****8901”的形式输出 '12345678901'.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2'); 此段正则匹配字符串 ...

  2. H5 canvas绘制出现模糊的问题

    在之前做移动端小游戏幸运转盘.九宫格转盘,使用到了 canvas ,也是第一次在项目中使用 canvas 来实现. 近期测试人员反应 canvas 绘制的内容太模糊,心想着用 canvas 绘制出来的 ...

  3. 语义化的html结构的好处

    HTML是提供网页文档内容的上下文结构和含义:html本身是没有表现的,我们看到例如<h1>是粗体,字体大小2em,加粗:<strong>是加粗的,不要认为这是html的表现, ...

  4. Virtualbox下Ubuntu与主机Win7共享文件夹

    记下来,免得老google. 1. 在虚拟机设置里设置好win7的共享文件夹位置:如c:\share 2.确定ubuntu下需要共享的文件夹,如~/linuxshare.注意,此文件夹名字必须与win ...

  5. maven编译设置pom.xml

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  6. Scala学习笔记(七):Application特质

    Scala提供了特质scala.Application 在单例对象名后面写上“extends Application”,把想要执行的代码直接放在单例对象的花括号之间 import ChecksumAc ...

  7. 【hello,world 也打脸】记storm-starter在某知名IDE下的悲催调试经历

    背景 最近收到这样一个问题: Storm处理消息时会根据Topology生成一棵消息树,Storm如何跟踪每个消息.如何保证消息不丢失以及如何实现重发消息机制? 虽已回复,但心想还是看下storm这块 ...

  8. ASP.NET MVC系列 框架搭建(一)之仓储层的搭建

    大神勿喷,小神默默学. 会了就是不值一提的东西,不会就是绝对的高大上. 最后上传源码.希望能给读者带来一些新的认识及知识. 还没上过头条..各位大神,请点支持一下小弟. 陆续更新.更新到你会为止!! ...

  9. Ztree异步加载自动展开节点

    在Ztree的官网Demo中,有自动展开的例子,是通过设置节点属性open:true来实现自动展开的,但是在异步加载中,这个属性设置为true也不会自动展开,因为open:true是指在有子节点的情况 ...

  10. Jquery实现异步上传图片

    利用jQuery的ajax函数就可以实现异步上传图片了.一开始我是想在处理程序中,直接用context.Request.Files来获取页面中的input file,但是不知道为什么一次获取不了.网上 ...