我想要一个DbSet
,它的类名是我存储在变量中的。
我试过使用这个代码:
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声明:
发布于 2019-08-18 13:00:00
问题是泛型DbSet类不继承(因此不能转换为)非泛型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>
属性名称与实体类名相同。
https://stackoverflow.com/questions/57543232
复制相似问题