首页 > 代码库 > T4 生成实体和简单的CRUD操作
T4 生成实体和简单的CRUD操作
<#@ template debug="false" hostspecific="false" language="C#" #> <#@ assembly name="System.Core.dll" #> <#@ assembly name="System.Data.dll" #> <#@ assembly name="System.Data.DataSetExtensions.dll" #> <#@ assembly name="System.Xml.dll" #> <#@ assembly name="MySql.Data" #> <#@ import namespace="System" #> <#@ import namespace="System.Xml" #> <#@ import namespace="System.Linq" #> <#@ import namespace="System.Text" #> <#@ import namespace="System.Data" #> <#@ import namespace=" System.Data.SqlClient" #> <#@ import namespace="MySql.Data.MySqlClient" #> <#@ import namespace="System.Collections.Generic" #> <#@ import namespace="System.IO" #> <#@ import namespace="System.Text.RegularExpressions" #><#+ #region GetDbTables public class DbHelper { #region 去下划线,转大写 public static string ToSplitFirstUpper(string file) { string[] words = file.Split(‘_‘); StringBuilder firstUpperWorld = new StringBuilder(); foreach (string word in words) { string firstUpper = ToFirstUpper(word); firstUpperWorld.Append(firstUpper); } string firstUpperFile = firstUpperWorld.ToString().TrimEnd(new char[] { ‘_‘ }); return firstUpperFile; } // 将字符串设置成首字母大写 public static string ToFirstUpper(string field) { string first = field.Substring(0, 1).ToUpperInvariant(); string result = first; if (field.Length > 1) { string after = field.Substring(1); result = first + after; } return result; } #endregion #region 生成简单的sql语句 public static string GetInsertSql(string connectionString, string database, string tableName) { var list = GetDbColumns(connectionString, database, tableName); StringBuilder sb1 = new StringBuilder(); StringBuilder sb2 = new StringBuilder(); foreach (var item in list) { string field = item.Field; if (field.ToLower() == "id") continue; sb1.Append(field).Append(", "); sb2.Append("?").Append(field).Append(", "); } string s1 = sb1.ToString().Trim(new char[] { ‘,‘, ‘ ‘ }); string s2 = sb2.ToString().Trim(new char[] { ‘,‘, ‘ ‘ }); return string.Format("INSERT INTO {0}({1}) VALUES({2})", tableName, s1, s2); } public static string GetParameter(string connectionString, string database, string tableName, bool hasId) { var list = GetDbColumns(connectionString, database, tableName); StringBuilder sb = new StringBuilder(); sb.Append("MySqlParameter[] paras = new MySqlParameter[] { \r\n"); foreach (var item in list) { if (item.Field.ToLower() == "id" && !hasId) continue; sb.AppendFormat(" new MySqlParameter(\"{0}\", this.{1}),\r\n", item.Field, ToSplitFirstUpper(item.Field)); } string s = sb.ToString().Trim(new char[] { ‘,‘, ‘ ‘, ‘\r‘, ‘\n‘ }); s = s + "\r\n };\r\n"; return s; } public static string GetUpdateSql(string connectionString, string database, string tableName) { var list = GetDbColumns(connectionString, database, tableName); StringBuilder sb1 = new StringBuilder(); foreach (var item in list) { string field = item.Field; if (field.ToLower() == "id") continue; sb1.Append(field).Append(" = ").Append("?").Append(field).Append(", "); } string s1 = sb1.ToString().Trim(new char[] { ‘,‘, ‘ ‘ }); return string.Format("UPDATE {0} SET {1} WHERE id = ?id", tableName, s1); } #endregion #region GetDbTables public static List<DbTable> GetDbTables(string connectionString, string database) { #region SQL string sql = string.Format("SHOW TABLE STATUS FROM {0};", database); #endregion DataTable dt = GetDataTable(connectionString, sql); return dt.Rows.Cast<DataRow>().Select(row => new DbTable { TableName = row.Field<string>("Name"), Rows = row.Field<UInt64>("Rows"), Comment = row.Field<string>("Comment") }).ToList(); } #endregion #region GetDbColumns public static List<DbColumn> GetDbColumns(string connectionString, string database, string tableName) { #region SQL string sql = string.Format("SHOW FULL COLUMNS FROM {0} FROM {1};", tableName, database); #endregion DataTable dt = GetDataTable(connectionString, sql); return dt.Rows.Cast<DataRow>().Select(row => new DbColumn { IsPrimaryKey = !String.IsNullOrEmpty(row.Field<string>("Key")), Field = row.Field<string>("Field"), Type = row.Field<string>("Type"), Comment = row.Field<string>("Comment"), IsNullable = row.Field<string>("NULL") == "YES" }).ToList(); } #endregion #region GetDataTable public static DataTable GetDataTable(string connectionString, string commandText, params SqlParameter[] parms) { using (MySqlConnection connection = new MySqlConnection(connectionString)) { MySqlCommand command = connection.CreateCommand(); command.CommandText = commandText; command.Parameters.AddRange(parms); MySqlDataAdapter adapter = new MySqlDataAdapter(command); DataTable dt = new DataTable(); adapter.Fill(dt); return dt; } } #endregion } #endregion #region DbTable /// <summary> /// 表结构 /// </summary> public sealed class DbTable { /// <summary> /// 表名称 /// </summary> public string TableName { get; set; } /// <summary> /// 行数 /// </summary> public UInt64 Rows { get; set; } /// <summary> /// 描述信息 /// </summary> public string Comment { get; set; } } #endregion #region DbColumn /// <summary> /// 表字段结构 /// </summary> public sealed class DbColumn { /// <summary> /// 是否主键 /// </summary> public bool IsPrimaryKey { get; set; } /// <summary> /// 字段名称 /// </summary> public string Field { get; set; } /// <summary> /// 字段类型 int(11) /// </summary> public string Type { get; set; } /// <summary> /// 字段类型int /// </summary> public string ColumnType { get { return Type.IndexOf(‘(‘) == -1 ? Type : Type.Substring(0, Type.IndexOf(‘(‘)); } } /// <summary> /// 数据库类型对应的C#类型 /// </summary> public string CSharpType { get { return MysqlDbTypeMap.MapCsharpType(ColumnType); } } /// <summary> /// /// </summary> public Type CommonType { get { return MysqlDbTypeMap.MapCommonType(ColumnType); } } /// <summary> /// 描述 /// </summary> public string Comment { get; set; } /// <summary> /// 是否允许空 /// </summary> public bool IsNullable { get; set; } /// <summary> /// 字符长度 /// </summary> public int CharLength { get { Regex regex = new Regex(@"(?<=\()\d*?(?=\))", RegexOptions.Singleline); if (regex.IsMatch(Type)) { Match match = regex.Match(Type); while (match != null && match.Success) { int charLength; if (Int32.TryParse(match.Value, out charLength)) { return charLength; } } } return 0; } } } #endregion #region SqlServerDbTypeMap public class MysqlDbTypeMap { public static string MapCsharpType(string dbtype) { if (string.IsNullOrEmpty(dbtype)) return dbtype; dbtype = dbtype.ToLower(); string csharpType = "object"; switch (dbtype) { case "bigint": csharpType = "long"; break; case "binary": csharpType = "byte[]"; break; case "bit": csharpType = "bool"; break; case "char": csharpType = "string"; break; case "date": csharpType = "DateTime"; break; case "datetime": csharpType = "DateTime"; break; case "datetime2": csharpType = "DateTime"; break; case "datetimeoffset": csharpType = "DateTimeOffset"; break; case "dityint": csharpType = "bool"; break; case "decimal": csharpType = "decimal"; break; case "float": csharpType = "double"; break; case "image": csharpType = "byte[]"; break; case "int": csharpType = "int"; break; case "money": csharpType = "decimal"; break; case "nchar": csharpType = "string"; break; case "ntext": csharpType = "string"; break; case "numeric": csharpType = "decimal"; break; case "nvarchar": csharpType = "string"; break; case "real": csharpType = "Single"; break; case "smalldatetime": csharpType = "DateTime"; break; case "smallint": csharpType = "short"; break; case "smallmoney": csharpType = "decimal"; break; case "sql_variant": csharpType = "object"; break; case "sysname": csharpType = "object"; break; case "text": csharpType = "string"; break; case "longtext": csharpType = "string"; break; case "time": csharpType = "TimeSpan"; break; case "timestamp": csharpType = "byte[]"; break; case "tinyint": csharpType = "byte"; break; case "uniqueidentifier": csharpType = "Guid"; break; case "varbinary": csharpType = "byte[]"; break; case "varchar": csharpType = "string"; break; case "xml": csharpType = "string"; break; default: csharpType = "object"; break; } return csharpType; } public static Type MapCommonType(string dbtype) { if (string.IsNullOrEmpty(dbtype)) return Type.Missing.GetType(); dbtype = dbtype.ToLower(); Type commonType = typeof(object); switch (dbtype) { case "bigint": commonType = typeof(long); break; case "binary": commonType = typeof(byte[]); break; case "bit": commonType = typeof(bool); break; case "char": commonType = typeof(string); break; case "date": commonType = typeof(DateTime); break; case "datetime": commonType = typeof(DateTime); break; case "datetime2": commonType = typeof(DateTime); break; case "datetimeoffset": commonType = typeof(DateTimeOffset); break; case "dityint": commonType = typeof(Boolean); break; case "decimal": commonType = typeof(decimal); break; case "float": commonType = typeof(double); break; case "image": commonType = typeof(byte[]); break; case "int": commonType = typeof(int); break; case "money": commonType = typeof(decimal); break; case "nchar": commonType = typeof(string); break; case "ntext": commonType = typeof(string); break; case "numeric": commonType = typeof(decimal); break; case "nvarchar": commonType = typeof(string); break; case "real": commonType = typeof(Single); break; case "smalldatetime": commonType = typeof(DateTime); break; case "smallint": commonType = typeof(short); break; case "smallmoney": commonType = typeof(decimal); break; case "sql_variant": commonType = typeof(object); break; case "sysname": commonType = typeof(object); break; case "text": commonType = typeof(string); break; case "time": commonType = typeof(TimeSpan); break; case "timestamp": commonType = typeof(byte[]); break; case "tinyint": commonType = typeof(byte); break; case "uniqueidentifier": commonType = typeof(Guid); break; case "varbinary": commonType = typeof(byte[]); break; case "varchar": commonType = typeof(string); break; case "xml": commonType = typeof(string); break; default: commonType = typeof(object); break; } return commonType; } } #endregion #>
主要跟大家交流下T4,我这里针对的是mysql,我本人比较喜欢用mysql,所以语法针对mysql,所以你要准备mysql的DLL了,同理sqlserver差不多,有兴趣可以自己写写,首先网上找了一个T4的帮助类,得到一些数据库属性,命名为 DbHelper.ttinclude
在加一个c#的sql帮助类, 命名为DBHelper.cs
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Data; using System.Data.SqlClient; using System.Security.Cryptography; using System.Configuration; using MySql.Data.MySqlClient; using System.Reflection; using System.Text; namespace ToolSite.Entity { public class DBHelper { //添加到配置文件的<configuration>节点中 // <connectionStrings> // <!--改写数据库名,登陆名,密码--> // <add name="conStr" connectionString="Data Source=.;Initial Catalog=;User ID=;Password="/> // // </connectionStrings> //<appSettings> // <add key="dbConnection" value=http://www.mamicode.com/"server=192.168.1.111/SQL2005;database=GCUMS;UID=sa;PWD=sa;max pool size=20000;Pooling=true;"/>>再家一个主要的T4文件,命名为 Entity.tt
<#@ include file="$(ProjectDir)Entity/DbHelper.ttinclude"#> using System; using MySql.Data.MySqlClient; using System.Data; using System.Collections.Generic; namespace ToolSite.Entity { public class Config { public static string DefaultDb = "<#=config.DbDatabase#>"; public static string ConnStr = "<#=config.ConnectionString#>"; } <#foreach(var table in DbHelper.GetDbTables(config.ConnectionString, config.DbDatabase)){#> <# string tableName = DbHelper.ToSplitFirstUpper(table.TableName); #> public partial class <#=tableName#> { #region Field <# foreach(DbColumn column in DbHelper.GetDbColumns(config.ConnectionString, config.DbDatabase, table.TableName)){#> /// <summary> /// <#= column.Comment#> /// </summary> public <#= column.CSharpType#> <#=DbHelper.ToSplitFirstUpper(column.Field)#> { get; set; } <#}#> #endregion public int Save() { <#=DbHelper.GetParameter(config.ConnectionString, config.DbDatabase, table.TableName, false)#> string sql = "<#=DbHelper.GetInsertSql(config.ConnectionString, config.DbDatabase, table.TableName)#>"; return DBHelper.NoneQuery(sql, paras); } public int Update() { <#=DbHelper.GetParameter(config.ConnectionString, config.DbDatabase, table.TableName, true)#> string sql = "<#=DbHelper.GetUpdateSql(config.ConnectionString, config.DbDatabase, table.TableName)#>"; return DBHelper.NoneQuery(sql, paras); } public static int Delete(int id) { string sql = string.Format("DELETE FROM <#=table.TableName#> WHERE id = {0}", id); return DBHelper.NoneQuery(sql); } public static <#=tableName#> GetById(int id) { string sql = string.Format("SELECT * FROM <#=table.TableName#> WHERE id = {0}", id); DataTable table = DBHelper.GetDateTable(sql); List<<#=tableName#>> list = new DatatableFill<<#=tableName#>>().FillModel(table); //List<<#=tableName#>> list = Mapper.DynamicMap<IDataReader, List<<#=tableName#>>>(table.CreateDataReader()); if (list == null || list.Count == 0) return null; return list[0]; } public static List<<#=tableName#>> GetList() { string sql = "SELECT * FROM <#=table.TableName#>"; DataTable table = DBHelper.GetDateTable(sql); List<<#=tableName#>> list = new DatatableFill<<#=tableName#>>().FillModel(table); //List<<#=tableName#>> list = Mapper.DynamicMap<IDataReader, List<<#=tableName#>>>(table.CreateDataReader()); return list; } public static List<<#=tableName#>> Find(string where) { string sql = string.Format("SELECT * FROM <#=table.TableName#> WHERE {0};", where); DataTable table = DBHelper.GetDateTable(sql); return new DatatableFill<<#=tableName#>>().FillModel(table); } public static List<<#=tableName#>> Find(string field, string prop) { return Find(string.Format(" {0} = ‘{1}‘ ", field, prop)); } public static bool Exist(string field, string prop) { int n = Count(field, prop); return n > 0 ? true : false; } public static int Count(string where) { string sql = string.Format("SELECT COUNT(1) FROM <#=table.TableName#> WHERE {0}", where); DataTable table = DBHelper.GetDateTable(sql); return Convert.ToInt32(table.Rows[0][0]); } public static int Count(string field, string prop) { return Count(string.Format(" {0} = ‘{1}‘ ", field, prop)); } public static int Count() { return Count(" 1 = 1 "); } public static List<<#=tableName#>> Find(int index, int size, ref int count) { count = Count(" 1 = 1 "); string sql = string.Format(" 1 = 1 Order by id desc LIMIT {0}, {1} ", index * size , size); return Find(sql); } public static List<<#=tableName#>> Find(string field, string prop, int index, int size, ref int count) { count = Count(field, prop); string sql = string.Format(" {0} = {1} Order by id desc LIMIT {2}, {3} ", field, prop, index, size); return Find(sql); } } <#}#> } <#+ class config { public static readonly string ConnectionString = "Server=127.0.0.1;Database=toolsite;Uid=root;Pwd=root;"; public static readonly string DbDatabase = "toolsite"; } #>你需要改的是最后那个文件的这个位置
class config { public static readonly string ConnectionString = "Server=127.0.0.1;Database=toolsite;Uid=root;Pwd=root;"; public static readonly string DbDatabase = "toolsite"; }怎么改我相信你懂的,点击下保存,你的实体类,跟数据库操作就生成了
最后生成的代码是这样子的,还是蛮粗糙的,如果你愿意改改,我相信会更好的!!!
using System; using MySql.Data.MySqlClient; using System.Data; using System.Collections.Generic; namespace ToolSite.Entity { public class Config { public static string DefaultDb = "toolsite"; public static string ConnStr = "Server=127.0.0.1;Database=toolsite;Uid=root;Pwd=root;"; } public partial class PageInfo { #region Field /// <summary> /// /// </summary> public int Id { get; set; } /// <summary> /// /// </summary> public int SiteId { get; set; } /// <summary> /// /// </summary> public int ParentId { get; set; } /// <summary> /// /// </summary> public string FileName { get; set; } /// <summary> /// /// </summary> public string Content { get; set; } /// <summary> /// /// </summary> public string Title { get; set; } /// <summary> /// /// </summary> public string Keywords { get; set; } /// <summary> /// /// </summary> public string Description { get; set; } /// <summary> /// /// </summary> public string H1 { get; set; } #endregion public int Save() { MySqlParameter[] paras = new MySqlParameter[] { new MySqlParameter("site_id", this.SiteId), new MySqlParameter("parent_id", this.ParentId), new MySqlParameter("file_name", this.FileName), new MySqlParameter("content", this.Content), new MySqlParameter("title", this.Title), new MySqlParameter("keywords", this.Keywords), new MySqlParameter("description", this.Description), new MySqlParameter("h1", this.H1) }; string sql = "INSERT INTO page_info(site_id, parent_id, file_name, content, title, keywords, description, h1) VALUES(?site_id, ?parent_id, ?file_name, ?content, ?title, ?keywords, ?description, ?h1)"; return DBHelper.NoneQuery(sql, paras); } public int Update() { MySqlParameter[] paras = new MySqlParameter[] { new MySqlParameter("id", this.Id), new MySqlParameter("site_id", this.SiteId), new MySqlParameter("parent_id", this.ParentId), new MySqlParameter("file_name", this.FileName), new MySqlParameter("content", this.Content), new MySqlParameter("title", this.Title), new MySqlParameter("keywords", this.Keywords), new MySqlParameter("description", this.Description), new MySqlParameter("h1", this.H1) }; string sql = "UPDATE page_info SET site_id = ?site_id, parent_id = ?parent_id, file_name = ?file_name, content = ?content, title = ?title, keywords = ?keywords, description = ?description, h1 = ?h1 WHERE id = ?id"; return DBHelper.NoneQuery(sql, paras); } public static int Delete(int id) { string sql = string.Format("DELETE FROM page_info WHERE id = {0}", id); return DBHelper.NoneQuery(sql); } public static PageInfo GetById(int id) { string sql = string.Format("SELECT * FROM page_info WHERE id = {0}", id); DataTable table = DBHelper.GetDateTable(sql); List<PageInfo> list = new DatatableFill<PageInfo>().FillModel(table); //List<PageInfo> list = Mapper.DynamicMap<IDataReader, List<PageInfo>>(table.CreateDataReader()); if (list == null || list.Count == 0) return null; return list[0]; } public static List<PageInfo> GetList() { string sql = "SELECT * FROM page_info"; DataTable table = DBHelper.GetDateTable(sql); List<PageInfo> list = new DatatableFill<PageInfo>().FillModel(table); //List<PageInfo> list = Mapper.DynamicMap<IDataReader, List<PageInfo>>(table.CreateDataReader()); return list; } public static List<PageInfo> Find(string where) { string sql = string.Format("SELECT * FROM page_info WHERE {0};", where); DataTable table = DBHelper.GetDateTable(sql); return new DatatableFill<PageInfo>().FillModel(table); } public static List<PageInfo> Find(string field, string prop) { return Find(string.Format(" {0} = ‘{1}‘ ", field, prop)); } public static bool Exist(string field, string prop) { int n = Count(field, prop); return n > 0 ? true : false; } public static int Count(string where) { string sql = string.Format("SELECT COUNT(1) FROM page_info WHERE {0}", where); DataTable table = DBHelper.GetDateTable(sql); return Convert.ToInt32(table.Rows[0][0]); } public static int Count(string field, string prop) { return Count(string.Format(" {0} = ‘{1}‘ ", field, prop)); } public static int Count() { return Count(" 1 = 1 "); } public static List<PageInfo> Find(int index, int size, ref int count) { count = Count(" 1 = 1 "); string sql = string.Format(" 1 = 1 Order by id desc LIMIT {0}, {1} ", index * size , size); return Find(sql); } public static List<PageInfo> Find(string field, string prop, int index, int size, ref int count) { count = Count(field, prop); string sql = string.Format(" {0} = {1} Order by id desc LIMIT {2}, {3} ", field, prop, index, size); return Find(sql); } } public partial class SiteInfo { #region Field /// <summary> /// /// </summary> public int Id { get; set; } /// <summary> /// /// </summary> public string Name { get; set; } /// <summary> /// /// </summary> public string Template { get; set; } #endregion public int Save() { MySqlParameter[] paras = new MySqlParameter[] { new MySqlParameter("name", this.Name), new MySqlParameter("template", this.Template) }; string sql = "INSERT INTO site_info(name, template) VALUES(?name, ?template)"; return DBHelper.NoneQuery(sql, paras); } public int Update() { MySqlParameter[] paras = new MySqlParameter[] { new MySqlParameter("id", this.Id), new MySqlParameter("name", this.Name), new MySqlParameter("template", this.Template) }; string sql = "UPDATE site_info SET name = ?name, template = ?template WHERE id = ?id"; return DBHelper.NoneQuery(sql, paras); } public static int Delete(int id) { string sql = string.Format("DELETE FROM site_info WHERE id = {0}", id); return DBHelper.NoneQuery(sql); } public static SiteInfo GetById(int id) { string sql = string.Format("SELECT * FROM site_info WHERE id = {0}", id); DataTable table = DBHelper.GetDateTable(sql); List<SiteInfo> list = new DatatableFill<SiteInfo>().FillModel(table); //List<SiteInfo> list = Mapper.DynamicMap<IDataReader, List<SiteInfo>>(table.CreateDataReader()); if (list == null || list.Count == 0) return null; return list[0]; } public static List<SiteInfo> GetList() { string sql = "SELECT * FROM site_info"; DataTable table = DBHelper.GetDateTable(sql); List<SiteInfo> list = new DatatableFill<SiteInfo>().FillModel(table); //List<SiteInfo> list = Mapper.DynamicMap<IDataReader, List<SiteInfo>>(table.CreateDataReader()); return list; } public static List<SiteInfo> Find(string where) { string sql = string.Format("SELECT * FROM site_info WHERE {0};", where); DataTable table = DBHelper.GetDateTable(sql); return new DatatableFill<SiteInfo>().FillModel(table); } public static List<SiteInfo> Find(string field, string prop) { return Find(string.Format(" {0} = ‘{1}‘ ", field, prop)); } public static bool Exist(string field, string prop) { int n = Count(field, prop); return n > 0 ? true : false; } public static int Count(string where) { string sql = string.Format("SELECT COUNT(1) FROM site_info WHERE {0}", where); DataTable table = DBHelper.GetDateTable(sql); return Convert.ToInt32(table.Rows[0][0]); } public static int Count(string field, string prop) { return Count(string.Format(" {0} = ‘{1}‘ ", field, prop)); } public static int Count() { return Count(" 1 = 1 "); } public static List<SiteInfo> Find(int index, int size, ref int count) { count = Count(" 1 = 1 "); string sql = string.Format(" 1 = 1 Order by id desc LIMIT {0}, {1} ", index * size , size); return Find(sql); } public static List<SiteInfo> Find(string field, string prop, int index, int size, ref int count) { count = Count(field, prop); string sql = string.Format(" {0} = {1} Order by id desc LIMIT {2}, {3} ", field, prop, index, size); return Find(sql); } } }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。