c# - 动态获取一个 DbSet
问题描述
我想得到一个DbSet
我存储在变量中的类名。
我试过这段代码:
string name = "ParosLineas";
var dbset = (System.Data.Entity.DbSet)efContext.GetType().GetProperty(name).GetValue(efContext);
dbset.AddRange(dates.[name]);
efContext.SaveChanges();
但我收到此错误:
System.InvalidCastException:'无法将'System.Data.Entity.DbSet1 [Report.Models.ParosLinea]'类型的对象转换为'System.Data.Entity.DbSet'
解决方案
问题是通用DbSet<TEntity>类不继承(因此不能转换为)非通用DbSet。
我看到两个选项。
如果您知道实体类的命名空间名称,则可以使用它Type.GetType
来获取对应的Type
名称,然后可以使用该名称来调用返回非通用对象的非通用DbContext.Set方法DbSet
,例如
string nameSpace = "MyEntities";
string name = "ParosLineas";
var type = Type.GetType($"{namespace}.{name}");
var dbSet = efContext.Set(type);
另一种方法是使用反射来获取DbSet<T>
属性,但将结果转换为IQueryable
. 然后你可以使用IQueryable.ElementType
来调用Set
上面的非泛型方法:
string name = "ParosLineas";
var type = ((IQueryable)efContext.GetType().GetProperty(name).GetValue(efContext))
.ElementType;
var dbSet = db.Set(type);
第一种方法是优选的。首先,因为它使用较少的调用,其次,因为在上下文中不需要DbSet<T>
属性并且不假设DbSet<T>
属性名称与实体类名称相同。
推荐阅读
- php - 在 laravel 6.12 上公开/配置 SimpleSamlphp 的网络路由
- matlab - 随机游走:如何正确退出 for 循环
- flutter - 如何修复 GridView 和 AnimationBuilder 中的 Jank?
- python - 如何在 Matplotlib 中调试散点图?
- javascript - 我如何在某些元素之后选择元素
- firewall - 触发防火墙阻止事件时如何在 Cloudflare 中触发阻止 IP?
- python - 从管道中的 python 脚本更新 Gitlab 环境变量
- sql - 按普通人分组递归循环
- winforms - 如何使用 .NET Core 的通用主机运行 Win Forms 并让它控制主机生命周期?
- hadoop - Kerberized 环境中需要 Solr UI 身份验证