You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 08:54:03