Entity Framework Core 5如何获取主表及所有关联表的全部列名
解决方案
完全可以通过EF Core 5原生能力实现该需求,不需要额外引入外部方案,推荐优先使用EF Core元数据API实现,比直接反射更适配EF的映射规则。
方案1:使用EF Core元数据API(推荐)
该方案可以准确获取EF映射的属性名/数据库实际列名,自动适配你定义的所有导航关联,后续新增关联表无需修改代码:
// 替换为你自己的DbContext实例 using var dbContext = new 你的DbContext类名(); var assetEntity = dbContext.Model.FindEntityType(typeof(Asset)); var columnList = new List<string>(); // 1. 加入主表Asset的符合要求的列 var assetColumns = assetEntity.GetProperties() // 若需要获取数据库实际列名,将p.Name替换为p.GetColumnName() .Select(p => p.Name) .Where(c => c == "Id" || !c.EndsWith("Id")); columnList.AddRange(assetColumns); // 2. 遍历所有非集合类型的导航属性,加入关联表的列 foreach (var nav in assetEntity.GetNavigations()) { // 跳过集合类型导航(比如你代码中的AssetFiles集合,不需要可保留该过滤) if (nav.IsCollection) continue; var relatedEntity = nav.TargetEntityType; var relatedColumns = relatedEntity.GetProperties() // 拼接前缀,生成CategoryName、ManufacturerName格式的列名 .Select(p => $"{nav.Name}{p.Name}") .Where(c => c.EndsWith("Id") ? c == $"{nav.Name}Id" : true); columnList.AddRange(relatedColumns); } // 可选:去重后返回 return columnList.Distinct().ToList();
方案2:纯反射实现(不需要依赖DbContext)
如果不需要获取EF映射的数据库列名,仅需要获取C#实体类的属性名,可以用纯反射实现:
var assetType = typeof(Asset); var columnList = new List<string>(); // 1. 加入主表Asset的符合要求的列 var assetColumns = assetType.GetProperties() .Where(p => p.PropertyType.IsValueType || p.PropertyType == typeof(string)) .Select(p => p.Name) .Where(c => c == "Id" || !c.EndsWith("Id")); columnList.AddRange(assetColumns); // 2. 遍历引用类型导航属性,加入关联表的列 var navProperties = assetType.GetProperties() .Where(p => !p.PropertyType.IsValueType && p.PropertyType != typeof(string) && !typeof(System.Collections.IEnumerable).IsAssignableFrom(p.PropertyType)); foreach (var navProp in navProperties) { var relatedType = navProp.PropertyType; var relatedColumns = relatedType.GetProperties() .Where(p => p.PropertyType.IsValueType || p.PropertyType == typeof(string)) .Select(p => $"{navProp.Name}{p.Name}") .Where(c => c.EndsWith("Id") ? c == $"{navProp.Name}Id" : true); columnList.AddRange(relatedColumns); } return columnList.Distinct().ToList();
内容的提问来源于stack exchange,提问作者DRW
相关产品推荐
相关产品推荐

