如何从EF Core/.NET Core 2.0中的实体名称获取DbSet

len*_*iep 9 c# entity-framework

我有DbContext几个DbSet<T>属性:

public virtual DbSet<A> A { get; set; }
public virtual DbSet<B> B { get; set; }
public virtual DbSet<C> C { get; set; }
...
Run Code Online (Sandbox Code Playgroud)

在某些情况下,我现在必须能够以实体名称作为字符串检索特定的DbSet(例如,当用户输入"A"时,我需要获取Dbset<A>).

在以前的EF版本中,以下是可能的:

var dbset = Context.Set(Type.GetType(A));

使用当前版本的EF核心有类似的方法吗?我已经尝试了几种方法来实现这一点,但我现在使用它的唯一方法是使用一个相当丑陋的开关/案例,我想摆脱它.

我在这里发现了几个类似问题的帖子,但它们都与早期的.NET Core版本或EF5/EF6有关.

小智 7

这样做可以将de extension 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

例:

    // GET: api/Employees
    [HttpGet]
    public IEnumerable<object> GetEmployees()
    {
        return _context.Set(typeof(Employee));
    }
Run Code Online (Sandbox Code Playgroud)

  • @Sam `DbContext.Set` 现在不止一个签名,您需要指定签名,尝试如下所示: `public static DbSet&lt;T&gt; GetDbSet&lt;T&gt;(this DbContext _context) where T : class =&gt; (DbSet&lt;T&gt;)_context.GetType().GetMethod("Set", 类型:Type.EmptyTypes).MakeGenericMethod(typeof(T)).Invoke(_context, null);` (4认同)
  • 这将返回一个 IQueryable - 而不是 DbSet - 例如,如何将实体添加到该集合中? (3认同)
  • @ShimmyWeitzhandler 如果它被转换为 IQueryable,它如何返回 DbSet? (2认同)