首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >动态获取DbSet

动态获取DbSet
EN

Stack Overflow用户
提问于 2019-08-18 09:24:26
回答 1查看 1.2K关注 0票数 4

我想要一个DbSet,它的类名是我存储在变量中的。

我试过使用这个代码:

代码语言:javascript
运行
复制
string name = "ParosLineas";
var dbset = (System.Data.Entity.DbSet)efContext.GetType().GetProperty(name).GetValue(efContext);

dbset.AddRange(dates.[name]);
efContext.SaveChanges();

但我知道这个错误:

无法将'System.Data.Entity.DbSet1Report.Models.ParosLinea‘类型的对象强制转换为“System.Data.Entity.DbSet”类型

这是我的ParosLine声明:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-18 13:00:00

问题是泛型DbSet类不继承(因此不能转换为)非泛型DbSet

我有两种选择。

如果您知道实体类的命名空间名称,您可以使用Type.GetType获得相应的Type,然后调用非泛型的DbContext.Set方法,该方法返回一个非泛型的DbSet对象。

代码语言:javascript
运行
复制
string nameSpace = "MyEntities";
string name = "ParosLineas";
var type = Type.GetType($"{namespace}.{name}");
var dbSet = efContext.Set(type);

另一种方法是使用反射获取DbSet<T>属性,但将结果强制转换为IQueryable。然后,您可以使用IQueryable.ElementType调用非泛型Set方法,如下所示:

代码语言:javascript
运行
复制
string name = "ParosLineas";
var type = ((IQueryable)efContext.GetType().GetProperty(name).GetValue(efContext))
    .ElementType;
var dbSet = db.Set(type);

第一种方法更可取。首先,因为它使用的调用较少,其次,因为它不需要上下文中的DbSet<T>属性,并且不假定DbSet<T>属性名称与实体类名相同。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57543232

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档