源代码文件 c# 自动创建文件生成实体类
调用 new BuilderModel(new List<string>() { "Company", "User" });
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Reflection;
using System.Text;
namespace Study.Reflect.ORM.Extend
{
internal class BuilderModel
{
public string EntityFolderName
{
get
{
return SginConfigService.GetConfig("FolderName:Entity");
}
}
/// <summary>
/// 生成实体模型
/// </summary>
/// <param name="tableNameList"></param>
public BuilderModel(List<string> tableNameList)
{
foreach (var tableName in tableNameList)
{
StringBuilder entityResult = new StringBuilder();
entityResult.Append(@"
SELECT
column_id dolumnId,
ISNULL(t.desctr, '') AS desr,
col.name colname,
typ.name,
col.is_nullable as nullableSign
FROM sys.columns col
LEFT JOIN ( SELECT
ISNULL(CAST(properties.value AS VARCHAR), '') AS desctr ,
properties.minor_id AS minor_id
FROM sys.extended_properties properties
WHERE properties.major_id = OBJECT_ID(@TableName)
) t ON t.minor_id = col.column_id
JOIN sys.types typ ON col.system_type_id = typ.system_type_id
AND col.user_type_id = typ.user_type_id
WHERE object_id = OBJECT_ID(@TableName)");
var tbl = SqlHandle.SqlToDataTable(entityResult.ToString(), new SqlParameter("@TableName", tableName));
entityResult.Clear();
entityResult.AppendLine("using System;");
entityResult.AppendLine("using System.ComponentModel.DataAnnotations.Schema;");
entityResult.AppendLine("namespace " + Assembly.GetEntryAssembly().GetName().Name);
entityResult.AppendLine("{");
entityResult.AppendLine($"\t[Table(\"{tableName}\")]");
entityResult.AppendLine($"\tpublic class {tableName}");
entityResult.AppendLine("\t{");
foreach (DataRow row in tbl.Rows)
{
entityResult.AppendLine($"\t\t[Column(\"{ row["name"].ToString()}\")]");
entityResult.AppendLine($"\t\tpublic {BuilderField(row["name"].ToString(), bool.Parse(row["nullableSign"].ToString()))} {row["colname"].ToString()} {{ get; set; }}");
entityResult.AppendLine();
}
entityResult.AppendLine("\t}");
entityResult.AppendLine("}");
FileHandle.CreateEntity(EntityFolderName, tableName, entityResult.ToString());
}
}
/// <summary>
/// 数据库类型转c#类型
/// </summary>
/// <param name="type">数据库字段类型</param>
/// <param name="isNull">是否为空</param>
/// <returns></returns>
public string BuilderField(string type, bool isNull)
{
string result = string.Empty;
switch (type)
{
case "bigint":
result = "long";
break;
case "binary":
result = "byte[]";
break;
case "bit":
result = "bool";
break;
case "char":
result = "string";
break;
case "date":
result = "DateTime";
break;
case "datetime":
result = "DateTime";
break;
case "datetime2":
result = "DateTime";
break;
case "datetimeoffset":
result = "DateTimeOffset";
break;
case "decimal":
result = "decimal";
break;
case "float":
result = "float";
break;
case "image":
result = "byte[]";
break;
case "int":
result = "int";
break;
case "money":
result = "decimal";
break;
case "nchar":
result = "string";
break;
case "ntext":
result = "string";
break;
case "numeric":
result = "decimal";
break;
case "nvarchar":
result = "string";
break;
case "real":
result = "double";
break;
case "smalldatetime":
result = "DateTime";
break;
case "smallint":
result = "short";
break;
case "smallmoney":
result = "decimal";
break;
case "text":
result = "string";
break;
case "time":
result = "TimeSpan";
break;
case "timestamp":
result = "DateTime";
break;
case "tinyint":
result = "byte";
break;
case "uniqueidentifier":
result = "Guid";
break;
case "varbinary":
result = "byte[]";
break;
case "varchar":
result = "string";
break;
default:
result = "UNKNOWN_";
break;
}
if (result! != "string") result += isNull ? "?" : "";
return result;
}
}
}
using Study.Reflect.ORM.Model;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
namespace Study.Reflect.ORM.Extend
{
internal static class SqlHandle
{
public static string connectionString
{
get
{
return SginConfigService.GetConfig("ConnectionStrings:defulat");
}
}
public static DataTable SqlToDataTable(string sql, params SqlParameter[] parameters)
{
using SqlConnection con = new SqlConnection(connectionString);
con.OpenAsync();
using SqlCommand cmd = new SqlCommand(sql, con);
if (parameters != null) cmd.Parameters.AddRange(parameters);
SqlDataAdapter dataAdapter = new SqlDataAdapter(cmd);
DataTable table = new DataTable();
dataAdapter.Fill(table);
return table;
}
}
}
using System;
using System.IO;
using System.Text;
namespace Study.Reflect.ORM.Extend
{
internal class FileHandle
{
/// <summary>
/// 创建实体类文件
/// </summary>
/// <param name="entityFolderName">实体文件夹名</param>
/// <param name="fileName">文件名</param>
/// <param name="content">内容</param>
public static void CreateEntity(string entityFolderName, string fileName, string content)
{
var path = AppContext.BaseDirectory;
if (path.Contains("bin"))
{
path = path.Substring(0, path.IndexOf("bin"));
}
path += entityFolderName;
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
fileName = Path.Combine(path, fileName + ".cs");
if (File.Exists(fileName))
{
File.Delete(fileName);
}
//创建文件
using FileStream fileStream = new FileStream(fileName, FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
//把内容转成byte数组
byte[] vs = new UTF8Encoding(true).GetBytes(content);
fileStream.Write(vs, 0, vs.Length);
}
}
}