首页 > 解决方案 > 使用实体框架按名称获取表

问题描述

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

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

解决方案


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

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();

参考:如何使用反射调用泛型方法?


推荐阅读