我有DbContext
个DbSet<T>
个属性:
public virtual DbSet<A> A { get; set; }
public virtual DbSet<B> B { get; set; }
public virtual DbSet<C> C { get; set; }
...
在某些情况下,我现在必须能够以实体名称作为字符串检索特定的DbSet(例如,当用户输入“A”时,我需要获取Dbset<A>
)。
在以前的EF版本中,可能存在以下情况:
var dbset = Context.Set(Type.GetType(A));
使用当前版本的EF核心有类似的方法吗?我已经尝试了几种方法来实现这一点,但我现在使用它的唯一方法是使用一个相当丑陋的开关/案例,我想摆脱它。
我在这里发现了几个类似问题的帖子,但它们都与早期的.NET Core版本或EF5 / EF6有关。
答案 0 :(得分:5)
执行此操作以将de扩展Set(Type t)方法添加到dbcontext类。
using Microsoft.EntityFrameworkCore;
namespace ApiWebApplication.Utils
{
public static class MyExtensions
{
public static IQueryable<object> Set (this DbContext _context, Type t)
{
return (IQueryable<object>)_context.GetType().GetMethod("Set").MakeGenericMethod(t).Invoke(_context, null);
}
}
}
示例:
// GET: api/Employees
[HttpGet]
public IEnumerable<object> GetEmployees()
{
return _context.Set(typeof(Employee));
}