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

无需反射从DbContext获取所有可查询DbSet的方法

获取DbContext中所有可查询的DbSet(排除拥有实体)

要获取DbContext中所有可直接查询的DbSet,同时排除那些作为**拥有实体(Owned Entity)**的类型,可以通过以下步骤实现:

  • 从DbContext.Model.GetEntityTypes()获取所有注册的实体类型
  • 用IsOwned()方法过滤掉拥有实体(这类实体没有独立数据库表,无法通过独立DbSet查询)
  • 对剩余实体类型,通过DbContext.Set()方法获取对应的DbSet实例

非泛型DbSet获取示例

// 得到所有可查询的非泛型DbSet列表
var queryableDbSets = context.Model.GetEntityTypes()
    .Where(entityType => !entityType.IsOwned())
    .Select(entityType => context.Set(entityType.ClrType))
    .ToList();

泛型DbSet获取示例

如果需要强类型的泛型DbSet,可以通过反射创建:

var genericDbSets = new List<object>();
var setMethod = typeof(DbContext).GetMethod(nameof(DbContext.Set), Type.EmptyTypes);

foreach (var entityType in context.Model.GetEntityTypes().Where(et => !et.IsOwned()))
{
    var genericSetMethod = setMethod.MakeGenericMethod(entityType.ClrType);
    var dbSet = genericSetMethod.Invoke(context, null);
    genericDbSets.Add(dbSet);
}

关键说明

  • IsOwned()是EF Core区分拥有实体和普通实体的核心方法,拥有实体通常作为主实体的导航属性嵌入,没有独立数据库表,因此不需要(也无法)通过独立DbSet查询。
  • 如果还有其他需要排除的实体类型(比如抽象基类),可以额外添加过滤条件,比如!entityType.ClrType.IsAbstract。

内容的提问来源于stack exchange,提问作者Tony Valenti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 13:18:15