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
相关产品推荐
相关产品推荐

