无需反射从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
相关产品推荐
相关产品推荐

