Entity framework EF在运行时从类型获取数据库集名称
目的: 我需要获取数据库集的名称实体的名称 typeof(UserAccount)=“UserAccounts”。 但在运行时,我需要一个用于循环的公共类型,因此不知道示例“UserAccount”。 只有typeof中的“名称”吗 我已经用一些实体创建了一个DbContext。 我已经在谷歌上搜索了一段时间,但它似乎不适合我,因为类型转换 请参阅本说明底部的我的方法GetDbSetName 我对EF这个东西很陌生-所以请帮助med解决我的问题,如下所述;-)Entity framework EF在运行时从类型获取数据库集名称,entity-framework,type-conversion,dbcontext,typeof,dbset,Entity Framework,Type Conversion,Dbcontext,Typeof,Dbset,目的: 我需要获取数据库集的名称实体的名称 typeof(UserAccount)=“UserAccounts”。 但在运行时,我需要一个用于循环的公共类型,因此不知道示例“UserAccount”。 只有typeof中的“名称”吗 我已经用一些实体创建了一个DbContext。 我已经在谷歌上搜索了一段时间,但它似乎不适合我,因为类型转换 请参阅本说明底部的我的方法GetDbSetName 我对EF这个东西很陌生-所以请帮助med解决我的问题,如下所述;-) 公共类myenties:DbCon
公共类myenties:DbContext
{
公共数据库集用户帐户{get;set;}
公共数据库集用户角色{get;set;}
公共DbSet UserAccountRoles{get;set;}
}
定义了用于控制输出的类型列表:
public static List<Type> ModelListSorted()
{
List<Type> modelListSorted = new List<Type>();
modelListSorted.Add(typeof(UserRole));
modelListSorted.Add(typeof(UserAccountRole));
modelListSorted.Add(typeof(UserAccount));
return modelListSorted;
}
公共静态列表ModelListSorted()
{
List modelListSorted=新列表();
添加(typeof(UserRole));
添加(typeof(UserAccountRole));
添加(typeof(UserAccount));
返回模型列表排序;
}
下面的问题是使用Type——如果我使用“UserAccount”,它会工作,我会得到“UserAccounts”。
但是我在运行时没有“UserAccount”,因为我在一个带有一系列类型的循环中。
我只有类型列表,给出了e
public static loopList()
{
List<Type> modelListSorted = ModelListSorted();
foreach (Type currentType in modelListSorted)
{
string s = DataHelper.GetDbSetName(currentType, db);
}
}
publicstaticlooplist()
{
List modelListSorted=modelListSorted();
foreach(modelListSorted中的类型currentType)
{
字符串s=DataHelper.GetDbSetName(currentType,db);
}
}
这是给我挑战的方法;-)强>
意思是不编译。
说我错过了一个集会?
我知道这很假,但这能顺利完成吗
public static string GetDbSetName(Type parmType, MyEntities db)
{
string dbsetname = (db as IObjectContextAdapter).ObjectContext.CreateObjectSet<parmType>().EntitySet.Name;
return dbsetname;
}
public静态字符串GetDbSetName(类型parmType,MyEntities db)
{
字符串dbsetname=(db作为IObjectContextAdapter).ObjectContext.CreateObjectSet().EntitySet.Name;
返回dbsetname;
}
这里的挑战是涉及到两个反射步骤,一个是调用通用的CreateObjectSet
方法,另一个是从结果中获取EntitySet
。以下是一种方法:
首先,方法:
string GetObjectSetName(ObjectContext oc, MethodInfo createObjectSetMethodInfo,
Type objectSetType, Type entityType)
{
var objectSet = createObjectSetMethodInfo.MakeGenericMethod(entityType)
.Invoke(oc, null);
var pi = objectSetType.MakeGenericType(entityType).GetProperty("EntitySet");
var entitySet = pi.GetValue(objectSet) as EntitySet;
return entitySet.Name;
}
如您所见,我首先通过调用表示泛型方法CreateObjectSet()
的MethodInfo
来获取ObjectSet
。然后我为泛型类型ObectSet
的EntitySet
属性找到PropertyInfo
。最后,我得到这个属性的值和获得的EntitySet
的名称
为此,我首先为CreateObjectSet()
(不带参数的)和ObjectSet
类型获取MethodInfo
var createObjectSetMethodInfo =
typeof(ObjectContext).GetMethods()
.Single(i => i.Name == "CreateObjectSet"
&& !i.GetParameters().Any());
var objectSetType = Assembly.GetAssembly(typeof(ObjectContext))
.GetTypes()
.Single(t => t.Name == "ObjectSet`1");
在GetObjectSetName
中,它们的泛型参数由具体的实体类型指定,该实体类型由这些“MakeGeneric…”方法完成
在EF 6中,这些应该是使用s的:
using System.Data.Entity.Core.Metadata.Edm
using System.Data.Entity.Core.Objects
using System.Data.Entity.Infrastructure
using System.Linq
using System.Reflection
你好,格塔诺尔。谢谢你的回复-好的和简单的想法!我在以下行中遇到错误:var objectSet=createObjectSetMethodInfo.MakeGenericMethod(entityType).Invoke(oc,null)代码>异常消息:{“对象与目标类型不匹配。”}我认为问题就在这里:var oc=(dbContextInstance作为IObjectContextAdapter)代码>正如我们所期望的System.Data.Objects.ObjectContext,但正在获取System.Data.Entity.Core.ObjectContext?-但我不知道如何解决它?这一行var entitySet=pi.GetValue(objectSet)作为entitySet代码>异常消息:{“对象与目标类型不匹配”。}您是否可以帮助解决此问题以及之前的问题?我在参考资料中有框架6.1.1?现在我已将其删除并重新安装。我现在可以编译您的代码,而无需更改我的以下用法:System.Linq;制度反思;System.Data.Entity.Core.Objects;System.Data.Metadata.Edm;使用System.Data.Entity.Infrastructure;但是这一行var entitySet=pi.GetValue(objectSet)作为entitySet代码>返回null。调试时,我可以看到objectSet中用于GetValue方法的变量吗?
var oc = (dbContextInstance as IObjectContextAdapter).ObjectContext;
var entityType = typeof(UserRole);
var name = GetObjectSetName(oc, createObjectSetMethodInfo, objectSetType, entityType);
using System.Data.Entity.Core.Metadata.Edm
using System.Data.Entity.Core.Objects
using System.Data.Entity.Infrastructure
using System.Linq
using System.Reflection