//
using System.Collections;
namespace SafeCampus.SqlSugar;
///
/// CodeFirst功能类
///
[SuppressSniffer]
public static class CodeFirstUtils
{
///
/// CodeFirst生成数据库表结构和种子数据
///
/// codefirst选项
/// 程序集名称
public static void CodeFirst(BaseOptions options, string assemblyName)
{
var appName = assemblyName.Split(",")[0];
if (options.InitTable)//如果需要初始化表结构
{
Console.WriteLine($"开始初始化{appName}数据库表结构");
InitTable(assemblyName);
}
if (options.InitSeedData)
{
Console.WriteLine($"开始初始化{appName}数据库种子数据");
InitSeedData(assemblyName);
}
}
///
/// 初始化数据库表结构
///
/// 程序集名称
private static void InitTable(string assemblyName)
{
// 获取所有实体表-初始化表结构
var entityTypes = App.EffectiveTypes.Where(u =>
!u.IsInterface && !u.IsAbstract && u.IsClass && u.IsDefined(typeof(SugarTable), false) && u.Assembly.FullName == assemblyName);
if (!entityTypes.Any()) return;//没有就退出
foreach (var entityType in entityTypes)
{
var tenantAtt = entityType.GetCustomAttribute();//获取SqlSugar多租户特性
var ignoreInit = entityType.GetCustomAttribute();//获取忽略初始化特性
if (ignoreInit != null) continue;//如果有忽略初始化特性
if (tenantAtt == null) continue;//如果没有租户特性就下一个
var db = DbContext.DB.GetConnectionScope(tenantAtt.configId.ToString());//获取数据库对象
var splitTable = entityType.GetCustomAttribute();//获取自动分表特性
if (splitTable == null)//如果特性是空
db.CodeFirst.InitTables(entityType);//普通创建
else
db.CodeFirst.SplitTables().InitTables(entityType);//自动分表创建
}
}
///
/// 初始化种子数据
///
/// 程序集名称
private static void InitSeedData(string assemblyName)
{
// 获取所有种子配置-初始化数据
var seedDataTypes = App.EffectiveTypes.Where(u => !u.IsInterface && u is { IsAbstract: false, IsClass: true }
&& u.GetInterfaces().Any(i => i.HasImplementedRawGeneric(typeof(ISqlSugarEntitySeedData<>))) && u.Assembly.FullName == assemblyName);
if (!seedDataTypes.Any()) return;
foreach (var seedType in seedDataTypes)//遍历种子类
{
//使用与指定参数匹配程度最高的构造函数来创建指定类型的实例。
var instance = Activator.CreateInstance(seedType);
//获取SeedData方法
var hasDataMethod = seedType.GetMethod("SeedData");
//判断是否有种子数据
var seedData = ((IEnumerable)hasDataMethod?.Invoke(instance, null))?.Cast