【问题标题】:How to get DbSet from entity name in EF Core / .NET Core 2.0 [duplicate]如何从 EF Core / .NET Core 2.0 中的实体名称获取 DbSet [重复]
【发布时间】:2017-12-20 16:19:06
【问题描述】:

我有一个 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&lt;A&gt;)。

在以前的 EF 版本中,可以进行以下操作:

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

当前版本的 EF 内核是否有类似的方法?我已经尝试了几种方法来实现这一点,但目前我让它工作的唯一方法是使用一个相当丑陋的开关/外壳,我想摆脱它。

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

【问题讨论】:

  • 我猜this 会有所帮助
  • 好的,仍然没有您可以从@JohnyL 链接中看到的方法。这是因为没有非通用的DbSet 类。问题是你真的需要这种方法吗?因为大多数DbSet&lt;T&gt; 方法都是从DbContext 以及非泛型版本(AttachAddRemoveUpdateFind 等)公开的,所以只采用非泛型@987654336 @ by entity type 可能是个问题。
  • 感谢@JohnyL 和 ivan-stoev,这帮了大忙。虽然我现在更好地理解为什么没有这种方法,但我仍然同意 GitHub 上的最后一条评论 - 有时在设计时根本不可能知道确切的实体类型。

标签: c# entity-framework-core


【解决方案1】:

执行此操作以将 de extension Set(Type t) 方法添加到 de 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));
    }

【讨论】:

  • 这将返回一个 IQueryable - 而不是 DbSet - 例如,如何将实体添加到此集合中?
  • @Darrell 它返回 DbSet。
  • @ShimmyWeitzhandler 如果将 DbSet 强制转换为 IQueryable,它如何返回?
  • 对于 .net6,此调用将抛出 AmbiguousMatchException - 使用 .net6 有其他方法吗?
  • @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", types: Type.EmptyTypes).MakeGenericMethod(typeof(T)).Invoke(_context, null);
猜你喜欢
  • 2021-04-17
  • 2020-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-06
  • 2021-05-14
  • 1970-01-01
相关资源
最近更新 更多