.Net8 T4快速生成类模板

<#@ template debug="true" hostspecific="true" language="C#" #>
<#@ assembly name="System"#>
<#@ assembly name="System.Xml"#>
<#@ assembly name="System.Xml.Linq"#>
<#@ assembly name="System.Core"#>
<#@ assembly name="System.Data"#>
<#@ assembly name="$(ProjectDir)\MySql.Data.dll" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="MySql.Data.MySqlClient" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.IO"#>
<#@ import namespace="System.Linq"#>
<#@ import namespace="System.Reflection"#>
<#@ import namespace="System.Text"#>
<#@ import namespace="System.Xml.Linq"#>
<#@ import namespace="Microsoft.VisualStudio.TextTemplating"#>
<#@ output extension=".cs" #>

<#
//System.Diagnostics.Debugger.Launch();
var manager = new BaseManager(Host, GenerationEnvironment, true);
//生成文件存放的路径
var OutputPath =Path.GetDirectoryName(Path.GetDirectoryName(Host.TemplateFile+"..")+"..");
OutputPath = BaseManager.CreateFileDirectory(OutputPath,"NinaMua.Module.Entity","Entity");
var spacename = "AutoCreateEntity";
// 数据库连接
var connectionString = @"server= 127.0.0.1;port=3306;user id=root;password=123456;charset=utf8;";
// 需要解析的数据库
var databases = new List<string>{ "datebase1","datebase2"};

foreach(var database in databases){

var entities = GetEntities(connectionString, database);
foreach(Entity entity in entities)
{
manager.StartBlock(entity.EntityName + ".cs",OutputPath);
#>
/*****************************************************************************************************
*
* * <#= entity.EntityName #>.cs
*
* 功 能: N/A
* 类 名: <#= entity.EntityName #>
*
* ───────────────────────────────────
* V1 <#= DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") #> N/A 初版
*
* Copyright (c) 2012 Maticsoft Corporation. All rights reserved.
*****************************************************************************************************/

using DataPool;
using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations.Schema;

namespace <#= spacename #>
{
/// <summary>
/// <#= entity.EntityName #>实体类(属性说明自动提取数据库字段的描述信息)
/// </summary>
[DatabaseMapping("<#= database #>")]
[Table("<#= entity.EntityName #>")]
[Serializable]
public partial class <#= entity.EntityName #>
{ <# foreach(var temp in entity.Fields) { #>
/// <summary>
/// <#=temp.Name #> : <#=temp.Comment #>
/// </summary>
[Description("<#=temp.Comment #>")]
[Column("<#=temp.Name #>")]
<#if(temp.Type=="string") {#>public <#= temp.Type #>? <# var namelist = temp.Name.Split('_');
var name = "";
foreach(var s in namelist){
name+=s.Substring(0,1).ToUpper()+s.Substring(1);
} #><#=name#> {get;set;} <# if(temp.Name.ToLower()=="id"){#> = System.Guid.NewGuid().ToString("N");<#} #>
<#}else {#>public <#= temp.Type #>? <# var namelist = temp.Name.Split('_');
var name = "";
foreach(var s in namelist){
name+=s.Substring(0,1).ToUpper()+s.Substring(1);
} #><#=name#> {get;set;}
<#}}#>
public Dictionary<string, object> AdditionalProperties { get; set; } = new Dictionary<string, object>();
}
}
<# manager.EndBlock(); } }
manager.Process(true);
#>

}

<#+
public static List<Entity> GetEntities(string connectionString,string databases)
{
var list = new List<Entity>();
var conn = new MySqlConnection(connectionString);
try
{
conn.Open();

var cmd = string.Format(@"SELECT `information_schema`.`COLUMNS`.`TABLE_SCHEMA`
,`information_schema`.`COLUMNS`.`TABLE_NAME`
,`information_schema`.`COLUMNS`.`COLUMN_NAME`
,`information_schema`.`COLUMNS`.`DATA_TYPE`
,`information_schema`.`COLUMNS`.`COLUMN_COMMENT`
FROM `information_schema`.`COLUMNS`
WHERE `information_schema`.`COLUMNS`.`TABLE_SCHEMA` = '{0}' ", databases);
using (var reader = MySqlHelper.ExecuteReader(conn, cmd))
{
while (reader.Read())
{
var db = reader["TABLE_SCHEMA"].ToString();
var table = reader["TABLE_NAME"].ToString();
var column = reader["COLUMN_NAME"].ToString();
var type = reader["DATA_TYPE"].ToString();
var comment = reader["COLUMN_COMMENT"].ToString();
var entity = list.FirstOrDefault(x => x.EntityName == table);
if(entity == null)
{
entity = new Entity(table);
entity.Fields.Add(new Field
{
Name = column,
Type = GetCLRType(type),
Comment = comment
});

list.Add(entity);
}
else
{
entity.Fields.Add(new Field
{
Name = column,
Type = GetCLRType(type),
Comment = comment
});
}
}
}
}
finally
{
conn.Close();
}

return list;
}

public static string GetCLRType(string dbType)
{
switch(dbType)
{
case "tinyint":
return "bool";
case "smallint":
case "mediumint":
case "int":
case "integer":
return "int";
case "double":
return "double";
case "float":
return "float";
case "bigint":
return "long";
case "decimal":
return "decimal";
case "numeric":
case "real":
return "decimal";
case "bit":
return "bool";
case "date":
case "time":
case "year":
case "datetime":
case "timestamp":
return "DateTime";
case "tinyblob":
case "blob":
case "mediumblob":
case "longblog":
case "binary":
case "varbinary":
return "byte[]";
case "char":
case "varchar":
case "tinytext":
case "text":
case "mediumtext":
case "longtext":
return "string";
case "point":
case "linestring":
case "polygon":
case "geometry":
case "multipoint":
case "multilinestring":
case "multipolygon":
case "geometrycollection":
case "enum":
case "set":
default:
return dbType;
}
}


public class Entity
{
public Entity()
{
this.Fields = new List<Field>();
}

public Entity(string name)
: this()
{
this.EntityName = name;
}

public string EntityName { get;set; }
public List<Field> Fields { get;set; }
}

public class Field
{
public string Name { get;set; }
public string Type { get;set; }
public string Comment { get;set; }
}

// Manager class records the various blocks so it can split them up
class BaseManager {
public struct Block {
public int Start, Length;
public String Name,OutputPath;
}
public static string CreateFileDirectory(string OutputPath, string NameSpaceOfClass ,string FileFolder)
{
//string OutputPath =Path.GetDirectoryName(Path.GetDirectoryName(Path.GetDirectoryName(Host.TemplateFile+"..")+"..")+"..");
OutputPath=Path.Combine(OutputPath,NameSpaceOfClass,FileFolder);
if (!Directory.Exists(OutputPath))
{
Directory.CreateDirectory(OutputPath);
}
return OutputPath;
}
public List<Block> blocks = new List<Block>();
public Block currentBlock;
public Block footerBlock = new Block();
public Block headerBlock = new Block();
public ITextTemplatingEngineHost host;
public ManagementStrategy strategy;
public StringBuilder template;
public BaseManager(ITextTemplatingEngineHost host, StringBuilder template, bool commonHeader) {
this.host = host;
this.template = template;
strategy = ManagementStrategy.Create(host);
}
public void StartBlock(String name,String outputPath) {
currentBlock = new Block { Name = name, Start = template.Length ,OutputPath=outputPath};
}

public void StartFooter() {
footerBlock.Start = template.Length;
}

public void EndFooter() {
footerBlock.Length = template.Length - footerBlock.Start;
}

public void StartHeader() {
headerBlock.Start = template.Length;
}

public void EndHeader() {
headerBlock.Length = template.Length - headerBlock.Start;
}

public void EndBlock() {
currentBlock.Length = template.Length - currentBlock.Start;
blocks.Add(currentBlock);
}
public void Process(bool split) {
String header = template.ToString(headerBlock.Start, headerBlock.Length);
String footer = template.ToString(footerBlock.Start, footerBlock.Length);
blocks.Reverse();
foreach(Block block in blocks) {
String fileName = Path.Combine(block.OutputPath, block.Name);
if (split) {
String content = header + template.ToString(block.Start, block.Length) + footer;
strategy.CreateFile(fileName, content);
template.Remove(block.Start, block.Length);
} else {
strategy.DeleteFile(fileName);
}
}
}
}
class ManagementStrategy
{
internal static ManagementStrategy Create(ITextTemplatingEngineHost host) {
return (host is IServiceProvider) ? new VSManagementStrategy(host) : new ManagementStrategy(host);
}

internal ManagementStrategy(ITextTemplatingEngineHost host) { }

internal virtual void CreateFile(String fileName, String content) {
File.WriteAllText(fileName, content);
}

internal virtual void DeleteFile(String fileName) {
if (File.Exists(fileName))
File.Delete(fileName);
}
}

class VSManagementStrategy : ManagementStrategy
{
private EnvDTE.ProjectItem templateProjectItem;

internal VSManagementStrategy(ITextTemplatingEngineHost host) : base(host) {
IServiceProvider hostServiceProvider = (IServiceProvider)host;
if (hostServiceProvider == null)
throw new ArgumentNullException("Could not obtain hostServiceProvider");

EnvDTE.DTE dte = (EnvDTE.DTE)hostServiceProvider.GetService(typeof(EnvDTE.DTE));
if (dte == null)
throw new ArgumentNullException("Could not obtain DTE from host");

templateProjectItem = dte.Solution.FindProjectItem(host.TemplateFile);
}
internal override void CreateFile(String fileName, String content) {
base.CreateFile(fileName, content);
//((EventHandler)delegate { templateProjectItem.ProjectItems.AddFromFile(fileName); }).BeginInvoke(null, null, null, null);
}
internal override void DeleteFile(String fileName) {
((EventHandler)delegate { FindAndDeleteFile(fileName); }).BeginInvoke(null, null, null, null);
}
private void FindAndDeleteFile(String fileName) {
foreach(EnvDTE.ProjectItem projectItem in templateProjectItem.ProjectItems) {
if (projectItem.get_FileNames(0) == fileName) {
projectItem.Delete();
return;
}
}
}
}
#>

posted @ 2025-09-30 17:48  NinaMua  阅读(11)  评论(0)    收藏  举报