/// <summary>生成简易版实体接口</summary> /// <param name="tables">表集合</param> /// <param name="option">可选项</param> /// <returns></returns> public static Int32 BuildInterfaces(IList <IDataTable> tables, BuilderOption option = null) { if (option == null) { option = new BuilderOption(); } else { option = option.Clone(); } option.Interface = true; option.Partial = true; if (Debug) { XTrace.WriteLine("生成简易接口 {0}", option.Output.GetBasePath()); } var count = 0; foreach (var item in tables) { // 跳过排除项 if (option.Excludes.Contains(item.Name)) { continue; } if (option.Excludes.Contains(item.TableName)) { continue; } var builder = new ClassBuilder { Table = item, Option = option.Clone(), }; if (Debug) { builder.Log = XTrace.Log; } builder.Load(item); // 自定义模型 var modelInterface = item.Properties["ModelInterface"]; if (!modelInterface.IsNullOrEmpty()) { builder.Option.ClassNameTemplate = modelInterface; } builder.Execute(); builder.Save(null, true, false); count++; } return(count); }
/// <summary>修正模型文件</summary> /// <param name="xmlFile"></param> /// <param name="option"></param> /// <param name="atts"></param> /// <param name="tables"></param> public static void FixModelFile(String xmlFile, BuilderOption option, IDictionary <String, String> atts, IList <IDataTable> tables) { // 保存文件名 if (xmlFile.IsNullOrEmpty()) { xmlFile = atts["ModelFile"]; } // 反哺。确保输出空特性 atts["Output"] = option.Output + ""; atts["NameSpace"] = option.Namespace + ""; atts["ConnName"] = option.ConnName + ""; atts["BaseClass"] = option.BaseClass + ""; atts.Remove("NameIgnoreCase"); atts.Remove("IgnoreNameCase"); atts.Remove("ChineseFileName"); atts.Remove("ModelFile"); // 更新xsd atts["xmlns"] = atts["xmlns"].Replace("ModelSchema", "Model2020"); atts["xs:schemaLocation"] = atts["xs:schemaLocation"].Replace("ModelSchema", "Model2020"); // 保存模型文件 var xmlContent = File.ReadAllText(xmlFile); var xml2 = ModelHelper.ToXml(tables, atts); if (xmlContent != xml2) { File.WriteAllText(xmlFile, xml2); } }
/// <summary>加载模型文件</summary> /// <param name="xmlFile">Xml模型文件</param> /// <param name="option">生成可选项</param> /// <param name="atts">扩展属性字典</param> /// <returns></returns> public static IList <IDataTable> LoadModels(String xmlFile, BuilderOption option, out IDictionary <String, String> atts) { if (xmlFile.IsNullOrEmpty()) { var di = ".".GetBasePath().AsDirectory(); //XTrace.WriteLine("未指定模型文件,准备从目录中查找第一个xml文件 {0}", di.FullName); // 选当前目录第一个 xmlFile = di.GetFiles("*.xml", SearchOption.TopDirectoryOnly).FirstOrDefault()?.FullName; } if (xmlFile.IsNullOrEmpty()) { throw new Exception("找不到任何模型文件!"); } xmlFile = xmlFile.GetBasePath(); if (!File.Exists(xmlFile)) { throw new FileNotFoundException("指定模型文件不存在!", xmlFile); } // 导入模型 var xmlContent = File.ReadAllText(xmlFile); atts = new NullableDictionary <String, String>(StringComparer.OrdinalIgnoreCase) { ["xmlns"] = "http://www.newlifex.com/Model2022.xsd", ["xmlns:xs"] = "http://www.w3.org/2001/XMLSchema-instance", ["xs:schemaLocation"] = "http://www.newlifex.com http://www.newlifex.com/Model2022.xsd" }; if (Debug) { XTrace.WriteLine("导入模型:{0}", xmlFile); } // 导入模型 var tables = ModelHelper.FromXml(xmlContent, DAL.CreateTable, atts); if (option != null) { option.Output = atts["Output"] ?? Path.GetDirectoryName(xmlFile); option.Namespace = atts["NameSpace"] ?? Path.GetFileNameWithoutExtension(xmlFile); option.ConnName = atts["ConnName"]; option.BaseClass = atts["BaseClass"]; } // 保存文件名 atts["ModelFile"] = xmlFile; return(tables); }
/// <summary>为Xml模型文件生成实体类</summary> /// <param name="tables">模型文件</param> /// <param name="option">生成可选项</param> /// <param name="chineseFileName">是否中文名称</param> public static Int32 BuildTables(IList <IDataTable> tables, BuilderOption option, Boolean chineseFileName = true) { if (tables == null || tables.Count == 0) { return(0); } if (option == null) { option = new BuilderOption(); } else { option = option.Clone(); } option.Partial = true; var count = 0; foreach (var item in tables) { // 跳过排除项 if (option.Excludes.Contains(item.Name)) { continue; } if (option.Excludes.Contains(item.TableName)) { continue; } var builder = new EntityBuilder { AllTables = tables, Option = option.Clone(), }; builder.Load(item); builder.Execute(); builder.Save(null, true, chineseFileName); builder.Business = true; builder.Execute(); builder.Save(null, false, chineseFileName); count++; } return(count); }
public static Int32 Build(String xmlFile = null, String output = null, String nameSpace = null, String connName = null, Boolean?chineseFileName = null) { var option = new BuilderOption { Output = output, Namespace = nameSpace, ConnName = connName, Partial = true, }; var tables = ClassBuilder.LoadModels(xmlFile, option, out var atts); FixModelFile(xmlFile, option, atts, tables); return(BuildTables(tables, option, chineseFileName ?? true)); }
/// <summary>生成简易版模型</summary> /// <param name="tables">表集合</param> /// <param name="option">可选项</param> /// <returns></returns> public static Int32 BuildModels(IList <IDataTable> tables, BuilderOption option = null) { if (option == null) { option = new BuilderOption(); } else { option = option.Clone(); } option.Pure = true; var count = 0; foreach (var item in tables) { // 跳过排除项 if (option.Excludes.Contains(item.Name)) { continue; } if (option.Excludes.Contains(item.TableName)) { continue; } var builder = new ClassBuilder { Table = item, Option = option.Clone(), }; builder.Execute(); builder.Save(null, true, false); count++; } return(count); }
/// <summary>修正模型文件</summary> /// <param name="xmlFile"></param> /// <param name="option"></param> /// <param name="atts"></param> /// <param name="tables"></param> public static void FixModelFile(String xmlFile, BuilderOption option, IDictionary <String, String> atts, IList <IDataTable> tables) { // 保存文件名 if (xmlFile.IsNullOrEmpty()) { xmlFile = atts["ModelFile"]; } // 反哺。确保输出空特性 atts["Output"] = option.Output + ""; atts["NameSpace"] = option.Namespace + ""; atts["ConnName"] = option.ConnName + ""; atts["BaseClass"] = option.BaseClass + ""; atts.Remove("NameIgnoreCase"); atts.Remove("IgnoreNameCase"); atts.Remove("ChineseFileName"); atts.Remove("ModelFile"); atts.Remove("RenderGenEntity"); foreach (var item in tables) { item.Properties.Remove("RenderGenEntity"); } // 格式化处理字段名 if (Enum.TryParse(typeof(NameFormats), atts["NameFormat"], true, out var obj) && obj is NameFormats format && format > NameFormats.Default) { XTrace.WriteLine("处理表名字段名为:{0}", format); var resolve = ModelResolver.Current; foreach (var dt in tables) { if (dt.TableName.IsNullOrEmpty() || dt.TableName == dt.Name) { dt.TableName = resolve.GetDbName(dt.Name, format); } foreach (var col in dt.Columns) { if (col.ColumnName.IsNullOrEmpty() || col.ColumnName == col.Name) { col.ColumnName = resolve.GetDbName(col.Name, format); } } } } // 更新xsd atts["xmlns"] = atts["xmlns"].Replace("ModelSchema", "Model2022").Replace("Model2020", "Model2022"); atts["xs:schemaLocation"] = atts["xs:schemaLocation"].Replace("ModelSchema", "Model2022").Replace("Model2020", "Model2022"); // 版本和教程 var asm = AssemblyX.Create(Assembly.GetExecutingAssembly()); if (!atts.ContainsKey("Version")) { atts["Version"] = asm.FileVersion + ""; } if (!atts.ContainsKey("Document")) { atts["Document"] = "https://www.yuque.com/smartstone/xcode/model"; } // 保存模型文件 var xmlContent = File.ReadAllText(xmlFile); var xml2 = ModelHelper.ToXml(tables, atts); if (xmlContent != xml2) { if (Debug) { XTrace.WriteLine("修正模型:{0}", xmlFile); } File.WriteAllText(xmlFile, xml2); } }
/// <summary>为Xml模型文件生成实体类</summary> /// <param name="tables">模型文件</param> /// <param name="option">生成可选项</param> /// <param name="chineseFileName">是否中文名称</param> public static Int32 BuildTables(IList <IDataTable> tables, BuilderOption option, Boolean chineseFileName = true) { if (tables == null || tables.Count == 0) { return(0); } if (option == null) { option = new BuilderOption(); } else { option = option.Clone(); } option.Partial = true; if (Debug) { var output = option.Output; if (output.IsNullOrEmpty()) { output = "."; } XTrace.WriteLine("生成实体类 {0}", output.GetBasePath()); } var count = 0; foreach (var item in tables) { // 跳过排除项 if (option.Excludes.Contains(item.Name)) { continue; } if (option.Excludes.Contains(item.TableName)) { continue; } var builder = new EntityBuilder { AllTables = tables, Option = option.Clone(), }; if (Debug) { builder.Log = XTrace.Log; } builder.Load(item); builder.Execute(); builder.Save(null, true, chineseFileName); builder.Business = true; builder.Execute(); builder.Save(null, false, chineseFileName); count++; } return(count); }