gpt4 book ai didi

c# - 动态获取一个 DbSet

转载 作者:行者123 更新时间:2023-11-30 12:37:55 27 4
gpt4 key购买 nike

我想获取一个 DbSet,其中包含我存储在变量中的类名。

我试过这段代码:

string name = "ParosLineas";
var dbset = (System.Data.Entity.DbSet)efContext.GetType().GetProperty(name).GetValue(efContext);

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

但是我得到这个错误:

System.InvalidCastException: 'Unable to cast object of type 'System.Data.Entity.DbSet1[Report.Models.ParosLinea]' to type 'System.Data.Entity.DbSet'

这是我的 ParosLine 声明: enter image description here

最佳答案

问题是通用的 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>属性名与实体类名相同。

关于c# - 动态获取一个 DbSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57543232/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com