.Net Core 中使用PetaPoco ,T4生成模版
话不多说,直接上源码。
1.引用NuGet

2.添加T4
<#@ template debug="true" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="System.Data"#>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Data.Common" #>
<#@ import namespace="System.Data.SqlClient" #>
<#@ output extension=".cs" #>
<#
string Namespace="添加命名空间";
string RepoName="添加类名";
string ConnectionStr="添加连接串";
var builder = new T4Builder("Data Source=添加数据库连接");
#>
using PetaPoco.NetCore;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
namespace <#=Namespace #>
{
public partial class <#=RepoName #> : Database
{
/// <summary>
/// open the connection
/// </summary>
/// <returns></returns>
private static SqlConnection OpenConnection()
{
SqlConnection conn = new SqlConnection("添加连接串");
conn.Open();
return conn;
}
private static SqlConnection OpenConnection(string name)
{
SqlConnection conn = new SqlConnection(JsonConfig.JsonRead(name));
conn.Open();
return conn;
}
public <#=RepoName#>() : base(OpenConnection())
{
CommonConstruct();
}
public <#=RepoName#>(string connectionStringName) : base(OpenConnection(connectionStringName))
{
CommonConstruct();
}
partial void CommonConstruct();
public interface IFactory
{
<#=RepoName #> GetInstance();
}
public static IFactory Factory { get; set; }
public static <#=RepoName #> GetInstance()
{
if (_instance != null)
return _instance;
if (Factory != null)
return Factory.GetInstance();
else
return new <#=RepoName #>();
}
[ThreadStatic] static <#=RepoName #> _instance;
public override void OnBeginTransaction()
{
if (_instance == null)
_instance = this;
}
public override void OnEndTransaction()
{
if (_instance == this)
_instance = null;
}
public class Record<T> where T : new()
{
public static <#=RepoName #> repo { get { return <#=RepoName #>.GetInstance(); } }
public bool IsNew() { return repo.IsNew(this); }
public object Insert() { return repo.Insert(this); }
public void Save() { repo.Save(this); }
public int Update() { return repo.Update(this); }
public int Update(IEnumerable<string> columns) { return repo.Update(this, columns); }
public static int Update(string sql, params object[] args) { return repo.Update<T>(sql, args); }
public static int Update(Sql sql) { return repo.Update<T>(sql); }
public int Delete() { return repo.Delete(this); }
public static int Delete(string sql, params object[] args) { return repo.Delete<T>(sql, args); }
public static int Delete(Sql sql) { return repo.Delete<T>(sql); }
public static int Delete(object primaryKey) { return repo.Delete<T>(primaryKey); }
public static bool Exists(object primaryKey) { return repo.Exists<T>(primaryKey); }
public static T SingleOrDefault(object primaryKey) { return repo.SingleOrDefault<T>(primaryKey); }
public static T SingleOrDefault(string sql, params object[] args) { return repo.SingleOrDefault<T>(sql, args); }
public static T SingleOrDefault(Sql sql) { return repo.SingleOrDefault<T>(sql); }
public static T FirstOrDefault(string sql, params object[] args) { return repo.FirstOrDefault<T>(sql, args); }
public static T FirstOrDefault(Sql sql) { return repo.FirstOrDefault<T>(sql); }
public static T Single(object primaryKey) { return repo.Single<T>(primaryKey); }
public static T Single(string sql, params object[] args) { return repo.Single<T>(sql, args); }
public static T Single(Sql sql) { return repo.Single<T>(sql); }
public static T First(string sql, params object[] args) { return repo.First<T>(sql, args); }
public static T First(Sql sql) { return repo.First<T>(sql); }
public static List<T> Fetch(string sql, params object[] args) { return repo.Fetch<T>(sql, args); }
public static List<T> Fetch(Sql sql) { return repo.Fetch<T>(sql); }
public static List<T> Fetch(int page, int itemsPerPage, string sql, params object[] args) { return repo.Fetch<T>(page, itemsPerPage, sql, args); }
public static List<T> SkipTake(int skip, int take, string sql, params object[] args) { return repo.SkipTake<T>(skip, take, sql, args); }
public static List<T> SkipTake(int skip, int take, Sql sql) { return repo.SkipTake<T>(skip, take, sql); }
public static Page<T> Page(int page, int itemsPerPage, string sql, params object[] args) { return repo.Page<T>(page, itemsPerPage, sql, args); }
public static Page<T> Page(int page, int itemsPerPage, Sql sql) { return repo.Page<T>(page, itemsPerPage, sql); }
public static IEnumerable<T> Query(string sql, params object[] args) { return repo.Query<T>(sql, args); }
public static IEnumerable<T> Query(Sql sql) { return repo.Query<T>(sql); }
}
}
<#
foreach(var item in builder.Table)
{
#>
[TableName("<#=item.TableName#>")]
<#
if(!String.IsNullOrWhiteSpace(item.Primkey))
{
#>
[PrimaryKey("<#=item.Primkey #>")]
<#
}
#>
[ExplicitColumns]
public partial class <#=item.TableNameStr#>:<#=RepoName#>.Record<<#=item.TableNameStr#>>
{
<#
foreach(var col in item.Column)
{
#>
[Column] public <#=col.ColumnType#> <#=col.ColumnName#> {get;set;}
<#
}
#>
}
<#
}
#>
}
<#+
public class T4Builder
{
public List<String> TableList = new List<String>();
public List<TableFrame> Table = new List<TableFrame>();
public T4Builder(string conectionstring)
{
SqlConnection con = new SqlConnection(conectionstring);
con.Open();
SqlCommand cmd = new SqlCommand("select name from sysobjects where xtype='u'", con);
var reader = cmd.ExecuteReader();
while (reader.Read())
{
var tablename = reader.GetValue(0).ToString();
TableList.Add(tablename);
}
foreach (var tablename in TableList)
{
var TableFrame = new TableFrame();
TableFrame.TableName = "dbo." + tablename;
#region 获取主键
SqlCommand cmd_prikey = new SqlCommand("EXEC sp_pkeys @table_name='" + tablename + "' ", con);
var key_result = cmd_prikey.ExecuteReader();
while (key_result.Read())
{
TableFrame.Primkey = key_result.GetValue(3) != null ? key_result.GetValue(3).ToString() : null;
}
#endregion
#region 获取列名
SqlCommand cmd_table = new SqlCommand("select COLUMN_NAME,DATA_TYPE,NUMERIC_SCALE,IS_NULLABLE from information_schema.columns where TABLE_NAME='" + tablename + "'", con);
var table_result = cmd_table.ExecuteReader();
List<Colum> Column = new List<Colum>();
while (table_result.Read())
{
Colum Columindex = new Colum();
Columindex.ColumnName = table_result.GetValue(0) != null ? table_result.GetValue(0).ToString() : null;
if (!String.IsNullOrEmpty(Columindex.ColumnName))
{
var ColumTypeStr = GetPropertyType(table_result.GetValue(1) != null ? table_result.GetValue(1).ToString() : null, table_result.GetValue(2) != null ? table_result.GetValue(2).ToString() : null);
if (table_result.GetValue(3).ToString() == "YES" && ColumTypeStr != "string" && ColumTypeStr != "Guid")
{
ColumTypeStr = ColumTypeStr + "?";
}
Columindex.ColumnType = ColumTypeStr;
Column.Add(Columindex);
}
}
#endregion
TableFrame.Column = Column;
Table.Add(TableFrame);
}
con.Close();
con.Dispose();
}
private string GetPropertyType(string sqlType, string dataScale)
{
string sysType = "string";
sqlType = sqlType.ToLower();
switch (sqlType)
{
case "bigint":
sysType = "long";
break;
case "smallint":
sysType = "short";
break;
case "int":
sysType = "int";
break;
case "uniqueidentifier":
sysType = "Guid";
break;
case "smalldatetime":
case "datetime":
case "date":
sysType = "DateTime";
break;
case "float":
sysType = "double";
break;
case "real":
case "numeric":
case "smallmoney":
case "decimal":
case "money":
case "number":
sysType = "decimal";
break;
case "tinyint":
sysType = "byte";
break;
case "bit":
sysType = "bool";
break;
case "image":
case "binary":
case "varbinary":
case "timestamp":
sysType = "byte[]";
break;
}
if (sqlType == "number" && dataScale == "0")
return "long";
return sysType;
}
}
public class TableFrame
{
public string TableName { get; set; }
public string Primkey { get; set; }
public List<Colum> Column { get; set; }
public string TableNameStr
{
get
{
return TableName != null ? TableName.Replace("dbo.", "").Trim() : null;
}
}
}
public class Colum
{
public string ColumnName { get; set; }
public string ColumnType { get; set; }
}
#>
好到这T4模版在Core中生成 PatePoco模版已经结束了。这个也是一个简单的版本,希望大家有个参考随时沟通使用中的问题。
突然发现了一个小坑,每次conn都实例化一次,改进了下。
private static SqlConnection con;
/// <summary>
/// open the connection
/// </summary>
/// <returns></returns>
private static SqlConnection OpenConnection()
{
if (con == null)
{
con = new SqlConnection(JsonConfig.JsonRead("CGTSettings", "cgtTravelConnection"));
}
else
{
if (con.State == System.Data.ConnectionState.Closed)
con.Open();
}
return con;
}
private static SqlConnection OpenConnection(string name)
{
if (con == null)
{
con = new SqlConnection(JsonConfig.JsonRead(name));
}
else
{
if (con.State == System.Data.ConnectionState.Closed)
con.Open();
}
return con;
}
.Net Core 中使用PetaPoco ,T4生成模版的更多相关文章
- asp.net core使用Swashbuckle.AspNetCore(swagger)生成接口文档
asp.net core中使用Swashbuckle.AspNetCore(swagger)生成接口文档 Swashbuckle.AspNetCore:swagger的asp.net core实现 项 ...
- Asp.Net Core Web Api 使用 Swagger 生成 api 说明文档
最近使用 Asp.Net Core Web Api 开发项目服务端.Swagger 是最受欢迎的 REST APIs 文档生成工具之一,进入我的视野.以下为学习应用情况的整理. 一.Swagger 介 ...
- PetaPoco T4模板修改生成实体
PetaPoco T4 模板生成的实体类全部包含再一个.CS文件中.通过修改PetaPoco的T4模板,生成单文件实体. 1.生成单CS文件模板: SigleFile.ttinclude <#@ ...
- 在.net core 中PetaPoco结合EntityFrameworkCore使用codefirst方法进行开发
在.net core开发过程中,使用最多的就是注入方法.但是在.net core使用PetaPoco时,PetaPoco还不支持进行注入方式进行处理一些问题. 今天对PetaPoco进行了一些扩展,可 ...
- 真实项目中VS2015中自建T4模板生成文件的使用
有可能许多小伙伴们发现,vs2015和2012的自带T4模板中的.tt文件改变非常之多,如果仅仅copyEF系统自己生成的模板文件,那可累了.以下是我自己整理的在2012和2015中都可以试用的代码. ...
- ASP.NET Core 中的SEO优化(3):自定义路由匹配和生成
前言 前两篇文章主要总结了CMS系统两个技术点在ASP.NET Core中的应用: <ASP.NET Core 中的SEO优化(1):中间件实现服务端静态化缓存> <ASP.NET ...
- ASP.NET Core 中文文档 第二章 指南(2)用 Visual Studio 和 ASP.NET Core MVC 创建首个 Web API
原文:Building Your First Web API with ASP.NET Core MVC and Visual Studio 作者:Mike Wasson 和 Rick Anderso ...
- ASP.NET Core 中文文档 第二章 指南(4.6)Controller 方法与视图
原文:Controller methods and views 作者:Rick Anderson 翻译:谢炀(Kiler) 校对:孟帅洋(书缘) .张仁建(第二年.夏) .许登洋(Seay) .姚阿勇 ...
- ASP.NET Core 中的Ajax全局Antiforgery Token配置
前言 本文基于官方文档 <在 ASP.NET Core 防止跨站点请求伪造 (XSRF/CSRF) 攻击>扩展另一种全局配置Antiforgery方法,适用于使用ASP.NET Core ...
随机推荐
- 【t055】成绩统计
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 华南师大附中月考二已经结束,级长想知道最高分是谁.但是现在级长很忙,没有时间统计成绩,于是他找到了你, ...
- 【hdu 3032】Nim or not Nim?
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...
- 《Erlang程序设计》学习笔记-第2章 并发编程
http://blog.csdn.net/karl_max/article/details/3977860 1. 并发原语: (1) Pid = spawn(Fun) %% 创建一个新的并发进程,用于 ...
- 01_Git的安装和简单使用(命令行模式+图形化模式)
刚开始用git的小白适用,参考链接:http://www.cnblogs.com/qijunjun/p/7137207.html 实际项目开发中,我们经常会用一些版本控制器来托管自己的代码,今天 ...
- eclipse配置本地服务
1.下载安装eclipse 2.下载tomcat文件,并解压 3.下载tomcat插件 com.sysdeo.eclipse.tomcat_3.3.0 将com.sysdeo.eclipse.tomc ...
- 【LCA最近公共祖先】在线离线
[在线] 1.倍增法 现将深度较大的跳至与深度较小的统一深度.预处理$fa[u][i]$表示$u$往上跳$2^i$个单位后的祖先,则就可以像快速幂一样,将移动的步数化为二进制,如果第$i$位为$1$, ...
- 阿里云centos7.2自己安装mysql5.7远程不能访问解决方案
版权声明:转载也行 https://blog.csdn.net/u010955892/article/details/72774920 最近,无意中看到阿里云服务器降价,所以一时手痒,买了一年的服务器 ...
- Arcgis api for javascript学习笔记(4.5版本) - 点击多边形(Polygon)并高亮显示
在现在的 arcgis_js_v45_api 版本中并没有直接提供点击Polygon对象高亮显示.需要实现如下几个步骤: 1.点击地图时,获取Polygon的Graphic对象: 2.对获取到的Gra ...
- c语言学习笔记(4)——流程控制
一.什么是流程控制 程序代码执行的顺序 流程控制分类 顺序执行 选择执行 定义 有选择的执行某些代码 分类 if switch 循环执行 定义 某些代码会被重复执行 分类 for while do w ...
- cocos2d-x 打开控制面板
于cocos2dx反过来,我们所熟悉的控制台输出,可以查看日志,例如C介面printf();性能. int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTA ...