话不多说,直接上源码。

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生成模版的更多相关文章

  1. asp.net core使用Swashbuckle.AspNetCore(swagger)生成接口文档

    asp.net core中使用Swashbuckle.AspNetCore(swagger)生成接口文档 Swashbuckle.AspNetCore:swagger的asp.net core实现 项 ...

  2. Asp.Net Core Web Api 使用 Swagger 生成 api 说明文档

    最近使用 Asp.Net Core Web Api 开发项目服务端.Swagger 是最受欢迎的 REST APIs 文档生成工具之一,进入我的视野.以下为学习应用情况的整理. 一.Swagger 介 ...

  3. PetaPoco T4模板修改生成实体

    PetaPoco T4 模板生成的实体类全部包含再一个.CS文件中.通过修改PetaPoco的T4模板,生成单文件实体. 1.生成单CS文件模板: SigleFile.ttinclude <#@ ...

  4. 在.net core 中PetaPoco结合EntityFrameworkCore使用codefirst方法进行开发

    在.net core开发过程中,使用最多的就是注入方法.但是在.net core使用PetaPoco时,PetaPoco还不支持进行注入方式进行处理一些问题. 今天对PetaPoco进行了一些扩展,可 ...

  5. 真实项目中VS2015中自建T4模板生成文件的使用

    有可能许多小伙伴们发现,vs2015和2012的自带T4模板中的.tt文件改变非常之多,如果仅仅copyEF系统自己生成的模板文件,那可累了.以下是我自己整理的在2012和2015中都可以试用的代码. ...

  6. ASP.NET Core 中的SEO优化(3):自定义路由匹配和生成

    前言 前两篇文章主要总结了CMS系统两个技术点在ASP.NET Core中的应用: <ASP.NET Core 中的SEO优化(1):中间件实现服务端静态化缓存> <ASP.NET ...

  7. 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 ...

  8. ASP.NET Core 中文文档 第二章 指南(4.6)Controller 方法与视图

    原文:Controller methods and views 作者:Rick Anderson 翻译:谢炀(Kiler) 校对:孟帅洋(书缘) .张仁建(第二年.夏) .许登洋(Seay) .姚阿勇 ...

  9. ASP.NET Core 中的Ajax全局Antiforgery Token配置

    前言 本文基于官方文档 <在 ASP.NET Core 防止跨站点请求伪造 (XSRF/CSRF) 攻击>扩展另一种全局配置Antiforgery方法,适用于使用ASP.NET Core ...

随机推荐

  1. Java 常用工具类---- 各种字符集编码判断与转换

    import java.io.UnsupportedEncodingException; /** * 判断字符编码 * * @author guyinyihun */ public class Cha ...

  2. ArcSDE中Compress与Compact的区别

    原文 ArcSDE中Compress与Compact的区别 附件一”为两种数据库需要的管理工作.      与所表示的含义与操作是不同的.     对于来说,Compressing与Smart Dat ...

  3. C++常用数据结构的实现

    常用数据结构与算法的实现.整理与总结 我将我所有数据结构的实现放在了github中:Data-Structures-Implemented-By-Me 常用数据结构与算法的实现.整理与总结 KMP字符 ...

  4. hdfs的基本原理和基本操作总结

    hdfs基本原理 Hadoop分布式文件系统(HDFS)被设计成适合执行在通用硬件(commodity hardware)上的分布式文件系统.它和现有的分布式文件系统有非常多共同点. 但同一时候,它和 ...

  5. svn删除文件或文件夹后提交失败及解决

    svn删除文件夹后提交显示Item 'XXXX' is out of date 有这么几种可能, 1.别人已经提交代码.恰好这个文件或文件夹有改动,这样的情况须要先回复再更新再删除再提交. 2.没有人 ...

  6. Java 中StringBuffer与StringBuilder区别(转)及String类的一些基本操作代码

    String 字符串常量StringBuffer 字符串变量(线程安全)  多个线程访问时,不会产生问题(Synchronized)StringBuilder 字符串变量(非线程安全) 多个线程访问时 ...

  7. js中多层复杂并且动态键值JSON的获取方法

    开发中遇到了用js解析重新组装json数据的要求,关键点在于JSON中的串的键是动态的,多方查找解决了在此做个记录.同时我也深感js中循环的无赖,如果用i作为键会得到索引,用key作为循环变量竟然可以 ...

  8. 【b603】作业调度方案

    Time Limit: 1 second Memory Limit: 50 MB [问题描述] 我们现在要利用m台机器加工n个工件,每个工件都有m道工序,每道工序都在不同的指定的机器上完成.每个工件的 ...

  9. 定制Octopress

    在 github pages 上搭建好 octopress 博客之后,博客的基本功能就能使用了.如果想自己定制也是没问题的,octopress 有较详尽的官方文档,原则上有问题求助官方即可:octop ...

  10. atheros wifi 动因分析

    Ar6003 驱动文档摘要 1.  wmi : wireless module interface //无线模块结构 2.  bmi : bootloader message interface 3. ...