// See https://aka.ms/new-console-template for more information using Magic.CodeFirst; using Magic.Core; using Magic.Core.Entity; using Microsoft.Extensions.Configuration; using SqlSugar; using System.Collections; using System.Data; using System.Reflection; using System.Text; var assembles = new string[] { "Magic.FlowCenter.dll", "Magic.Core.dll" }; //首先创建数据库 CreateDatabase(); //初始化表结构 InitDatabase(assembles); //插入种子数据 InsertData(); Console.WriteLine("数据库迁移成功"); Console.ReadLine(); static void CreateDatabase() { var conn = SqlSugarHelper.GetSetting(); SqlSugarHelper.Db().GetConnectionScope(conn.DefaultDbNumber).DbMaintenance.CreateDatabase(); foreach (var item in conn.DbConfigs) { if (item.DbType != SqlSugar.DbType.Oracle.ToString()) SqlSugarHelper.Db().GetConnectionScope(item.DbNumber).DbMaintenance.CreateDatabase(); } } static void InitDatabase(string[] assembles) { var conn = SqlSugarHelper.GetSetting(); var configIds = new List(); configIds.Add(conn.DefaultDbNumber); foreach (var item in conn.DbConfigs) { configIds.Add(item.DbNumber); } foreach (var item in assembles) { Type[] types = Assembly .LoadFrom(item)//如果 .dll报错,可以换成 xxx.exe 有些生成的是exe .GetTypes() .Where(m => m.GetCustomAttribute() != null && m.Name != "FlcFlowinstanceOutput") .ToArray(); foreach (Type type in types) { if (type.GetCustomAttribute() == null) { SqlSugarHelper.Db().CodeFirst.InitTables(type); } else { SqlSugarHelper.Db().GetConnectionScope(type.GetCustomAttribute().configId).CodeFirst.InitTables(type); } } //SqlSugarHelper.Db().CodeFirst.InitTables(types); Console.WriteLine($"数据库{item}创建成功"); } } static void CreateSeedData(string[] assembles) { foreach (var item in assembles) { Type[] types = Assembly .LoadFrom(item)//如果 .dll报错,可以换成 xxx.exe 有些生成的是exe .GetTypes() .Where(m => m.GetCustomAttribute() != null && m.Name != "FlcFlowinstanceOutput") .ToArray(); //Get type of Worker SelectTable worker = new SelectTable(); //Get type of Worker Type workerType = typeof(SelectTable); //Get Generic Method MethodInfo staticDoWorkMethod = workerType.GetMethod("GetAll"); //Invoke StaticDoWork foreach (Type curType in types) { if (curType.IsClass && !curType.IsAbstract) { MethodInfo curMethod = staticDoWorkMethod.MakeGenericMethod(curType); var list = curMethod.Invoke(null, null); if (list == null) continue; var path = Path.Combine(@"D:\Workspace\admin-net-sqlsugar\backend\Magic.CodeFirst\SeedData", $"{curType.Name}SeedData.cs"); if (File.Exists(path)) File.Delete(path); FileStream fs = new FileStream(path, FileMode.CreateNew, FileAccess.ReadWrite); StreamWriter sw = new StreamWriter(fs); StringBuilder sb = new StringBuilder($@"using Magic.Core; using Magic.Core.Entity; namespace Magic.CodeFirst; public class {curType.Name}SeedData : ISeedData , ISqlSugarEntitySeedData<{curType.Name}> {{ public IEnumerable<{curType.Name}> HasData() {{ string json = @"""); sb.AppendLine(JsonUtil.ToJsonString(list).Replace(@"""", @"""""")); sb.AppendLine(@""";"); sb.AppendLine($@" List<{curType.Name}> list = JsonUtil.ToObject>(json); return list;"); sb.AppendLine(@"}}"); sw.Write(sb.ToString()); sw.Flush(); sw.Close(); }; } } } static void InsertData() { var baseType = typeof(ISeedData); var path = AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory; var referencedAssemblies = System.IO.Directory.GetFiles(path, "Magic.CodeFirst.dll").Select(Assembly.LoadFrom).ToArray(); var seedDataTypes = referencedAssemblies .SelectMany(a => a.DefinedTypes) .Select(type => type.AsType()) .Where(x => x != baseType && baseType.IsAssignableFrom(x)).ToArray(); foreach (var seedType in seedDataTypes) { var instance = Activator.CreateInstance(seedType); var hasDataMethod = seedType.GetMethod("HasData"); var seedData = ((IEnumerable)hasDataMethod?.Invoke(instance, null))?.Cast(); if (seedData == null) continue; var entityType = seedType.GetInterfaces().First().GetGenericArguments().First(); var seedDataTable = seedData.ToList().ToDataTable(); seedDataTable.TableName = SqlSugarHelper.Db().EntityMaintenance.GetEntityInfo(entityType).DbTableName; var storage = SqlSugarHelper.Db().Storageable(seedDataTable).ToStorage(); storage.AsInsertable.ExecuteCommand(); } } public static class ObjectExtension { public static DataTable ToDataTable(this List list) { DataTable result = new(); if (list.Count > 0) { // result.TableName = list[0].GetType().Name; // 表名赋值 PropertyInfo[] propertys = list[0].GetType().GetProperties(); foreach (PropertyInfo pi in propertys) { Type colType = pi.PropertyType; if (colType.IsGenericType && colType.GetGenericTypeDefinition() == typeof(Nullable<>)) { colType = colType.GetGenericArguments()[0]; } if (IsIgnoreColumn(pi)) continue; result.Columns.Add(pi.Name, colType); } for (int i = 0; i < list.Count; i++) { ArrayList tempList = new(); foreach (PropertyInfo pi in propertys) { if (IsIgnoreColumn(pi)) continue; object obj = pi.GetValue(list[i], null); tempList.Add(obj); } object[] array = tempList.ToArray(); result.LoadDataRow(array, true); } } return result; } private static bool IsIgnoreColumn(PropertyInfo pi) { var sc = pi.GetCustomAttributes(false).FirstOrDefault(u => u.IsIgnore == true); return sc != null; } } public class SelectTable { public static List GetAll() { var list = SqlSugarHelper.Db().Queryable().ToList(); return list.Any() ? list : null; } }