【问题标题】:Get table by name with Entity Framework使用实体框架按名称获取表
【发布时间】:2019-11-25 11:36:24
【问题描述】:

我有这段代码,一切正常。

using (var db = new ApplicationDbContext())
{
    md = db.Modles.ToList();
}

我的问题是我有一个名为M 的参数,这是我创建的模型的名称,因此它可以是动态的。

有没有办法做这样的事情:

var M = "Modles"; // or M = "Modles2"
using (var db = new ApplicationDbContext())
{
    md = db[M].ToList();
}

我试过Entity Framework Get Table By NameEntity Framework get table by variable name 但没有任何运气。 这个可以吗?

【问题讨论】:

标签: c# entity-framework


【解决方案1】:

您提供的第二个链接上的解决方案实际上不起作用,因为它缺少一个简单的步骤:DbContext 上的方法Set 是一种通用方法,因此您不能在不告诉类型的情况下简单地调用它,或者在编译时时间或至少在运行时。由于您希望动态调用它,因此运行时解析是您剩下的选项。以下示例应该可以工作:

var entityNs = "myentities";
var table = "Model";
var entityType = Type.GetType($"{entityNs}.{table}");
var methodInfo = typeof(ApplicationDbContext).GetMethod("Set");
var generic = methodInfo.MakeGenericMethod(entityType);
dynamic dbSet = generic.Invoke(myContext, null);
var list = dbSet.GetList();

参考:How do I use reflection to call a generic method?

【讨论】:

  • typeof(ApplicationDbContext).GetMethod("Set") 返回错误Ambiguous match found.
  • @TonyNielson 奇怪,这不会发生在我身上。您是否可能重载了 ApplicationDbContext 中的 Set 方法?尝试如下修改该行:var methodInfo = typeof(ApplicationDbContext).GetMethod("Set", new Type[0]);
猜你喜欢
  • 2013-10-16
  • 1970-01-01
  • 1970-01-01
  • 2012-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多