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

ASP.NET Core 6 EF Core:如何动态设置DbContext.Set<TEntity>的TEntity?

解决方案

在ASP.NET Core 6.0 + Entity Framework Core中,要动态传入实体类型复用代码,不能直接沿用旧版的字符串重载Set方法——EF Core已移除该重载,仅保留**泛型Set<T>和非泛型Set(Type)**两种方式,以下是两种可行实现:

方法一:使用非泛型Set(Type)方法

直接传入实体类型对象,操作DbSet的Local集合:

// 假设tableType是你要动态传入的实体类型(比如typeof(AgeGroup))
var dataSet = db.Set(tableType);
await dataSet.LoadAsync();

// 筛选出实现IReferenceTable接口的元素并排序
var tableData = dataSet.Local
    .OfType<IReferenceTable>()
    .OrderBy(rt => rt.SortOrder)
    .ToList();

方法二:通过反射调用泛型Set<T>方法

如果需要更灵活的泛型操作,可通过反射生成泛型Set方法实例:

// 获取DbContext的泛型Set方法
var setGenericMethod = typeof(DbContext)
    .GetMethod(nameof(DbContext.Set), Type.EmptyTypes)
    .MakeGenericMethod(tableType);
// 调用方法获取DbSet
var dataSet = (DbSet)setGenericMethod.Invoke(db, null);

await dataSet.LoadAsync();

var tableData = dataSet.Local
    .OfType<IReferenceTable>()
    .OrderBy(rt => rt.SortOrder)
    .ToList();

关键说明

旧版Entity Framework(EF6及更早)支持db.Set(string tableName)的字符串重载,但EF Core移除了该方法,必须传入Type类型对象而非字符串或变量名称。同时要确保所有目标实体类型都实现了IReferenceTable接口,这样OfType<IReferenceTable>才能正确筛选元素。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 18:22:06