diff --git a/Extensions/FreeSql.Extensions.ZeroEntity/ZeroDbContext.cs b/Extensions/FreeSql.Extensions.ZeroEntity/ZeroDbContext.cs
index 563cefac8..59563434a 100644
--- a/Extensions/FreeSql.Extensions.ZeroEntity/ZeroDbContext.cs
+++ b/Extensions/FreeSql.Extensions.ZeroEntity/ZeroDbContext.cs
@@ -273,7 +273,41 @@ ManyToMany 级联删除中间表(注意不删除外部根)
}
///
- /// 从数据库中加载
+ /// 从自定义中加载(多表)
+ /// - tableName 以及 Navigates 所依赖表 Schema
+ ///
+ public List LoadSchemasAndNavigates(string tableName, Func getSchemaHandler)
+ {
+ if (getSchemaHandler == null) throw new Exception($"{nameof(getSchemaHandler)} 不能为 null");
+ var schema = getSchemaHandler(tableName);
+ if (schema == null) throw new Exception($"{nameof(getSchemaHandler)}({tableName}) 返回值不能为 null");
+ var returnSchemas = new List();
+ returnSchemas.Add(schema);
+ LocalEachNavigate(schema);
+ return returnSchemas;
+
+ void LocalEachNavigate(TableDescriptor desc)
+ {
+ if (desc.Navigates?.Any() != true) return;
+ foreach(var nav in desc.Navigates)
+ {
+ if (returnSchemas.Any(a => a.Name == nav.RelTable)) continue;
+ var navSchema = getSchemaHandler(nav.RelTable);
+ if (navSchema == null) throw new Exception($"{nameof(getSchemaHandler)}({nav.RelTable}) 返回值不能为 null");
+ returnSchemas.Add(navSchema);
+ LocalEachNavigate(navSchema);
+ if (nav.Type == TableDescriptor.NavigateType.ManyToMany && !string.IsNullOrWhiteSpace(nav.ManyToMany))
+ {
+ var midSchema = getSchemaHandler(nav.ManyToMany);
+ if (midSchema == null) throw new Exception($"{nameof(getSchemaHandler)}({nav.ManyToMany}) 返回值不能为 null");
+ returnSchemas.Add(midSchema);
+ }
+ }
+ }
+ }
+
+ ///
+ /// 从数据库中加载(单表)
/// - 不支持 Navigates
/// - 不支持 Indexes IndexMethod
/// - 暂支持 SqlServer/MySql decimal(10,2)(其他数据库需实现对应 IDbFirst)