/// <summary> /// 添加表前后缀 /// </summary> /// <param name="type">实体类型</param> /// <param name="appDbContextAttribute">数据库上下文特性</param> /// <param name="entityTypeBuilder">实体类型构建器</param> /// <param name="dbContext">数据库上下文</param> /// <param name="dbContextType">数据库上下文类型</param> private static void AddTableAffixes(Type type, AppDbContextAttribute appDbContextAttribute, EntityTypeBuilder entityTypeBuilder, DbContext dbContext, Type dbContextType) { if (typeof(IPrivateEntityNotKey).IsAssignableFrom(type) || !string.IsNullOrEmpty(type.GetCustomAttribute <TableAttribute>(true)?.Schema)) { return; } // 获取 多租户 Schema var dynamicSchema = !typeof(IMultiTenantOnSchema).IsAssignableFrom(dbContextType) ? default : dbContextType.GetMethod(nameof(IMultiTenantOnSchema.GetSchemaName)).Invoke(dbContext, null).ToString(); if (appDbContextAttribute == null) { entityTypeBuilder.ToTable($"{type.Name}", dynamicSchema); } else { // 添加表统一前后缀,排除视图 if (!string.IsNullOrEmpty(appDbContextAttribute.TableSuffix) || !string.IsNullOrEmpty(appDbContextAttribute.TableSuffix)) { var tablePrefix = appDbContextAttribute.TablePrefix; var tableSuffix = appDbContextAttribute.TableSuffix; if (!string.IsNullOrEmpty(tablePrefix)) { // 如果前缀中找到 . 字符 if (tablePrefix.IndexOf(".") > 0) { var schema = tablePrefix.EndsWith(".") ? tablePrefix[0..^ 1] : tablePrefix;
/// <summary> /// 创建实体类型构建器 /// </summary> /// <param name="type">数据库关联类型</param> /// <param name="modelBuilder">模型构建器</param> /// <param name="dbContext">数据库上下文</param> /// <param name="dbContextType">数据库上下文类型</param> /// <param name="dbContextLocator">数据库上下文定位器</param> /// <param name="appDbContextAttribute">数据库上下文特性</param> /// <returns>EntityTypeBuilder</returns> private static EntityTypeBuilder CreateEntityTypeBuilder(Type type, ModelBuilder modelBuilder, DbContext dbContext, Type dbContextType, Type dbContextLocator, AppDbContextAttribute appDbContextAttribute = null) { // 反射创建实体类型构建器 var entityTypeBuilder = ModelBuildEntityMethod.MakeGenericMethod(type).Invoke(modelBuilder, null) as EntityTypeBuilder; // 添加表前后缀 AddTableAffixes(type, appDbContextAttribute, entityTypeBuilder, dbContext, dbContextType); // 如果未启用多租户支持或租户设置为OnDatabase 或 OnSchema 方案,则忽略多租户字段,另外还需要排除多租户数据库上下文定位器 if (dbContextLocator != typeof(MultiTenantDbContextLocator) && (!typeof(IPrivateMultiTenant).IsAssignableFrom(dbContextType) || typeof(IMultiTenantOnDatabase).IsAssignableFrom(dbContextType) || typeof(IMultiTenantOnSchema).IsAssignableFrom(dbContextType)) && type.GetProperty(nameof(Tenant.TenantId)) != null) { entityTypeBuilder.Ignore(nameof(Tenant.TenantId)); } return(entityTypeBuilder); }