目的:
我需要获取实体的dbset名称的名称
typeof(UserAccount)=“ UserAccounts”。
但是在运行时,我需要循环的通用类型,因此不知道示例“ UserAccount”。
仅来自typeof的“名称”?
我用一些实体创建了一个DbContext。
我已经搜寻了一段时间,但是由于类型转换,它似乎对我不起作用?
请参阅本说明底部的我的方法GetDbSetName。
我在EF方面还算是新手-因此请按照以下说明帮助解决我的问题;-)
public class MyEntities : DbContext
{
public DbSet<UserAccount> UserAccounts { get; set;}
public DbSet<UserRole> UserRoles { get; set; }
public DbSet<UserAccountRole> UserAccountRoles { get; set; }
}
定义了一个Type列表来控制输出:
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;
}
问题是在下面使用类型-如果我使用“ UserAccount”,它会起作用,并且会出现“ UserAccounts”。
但是我在运行时没有“ UserAccount”,因为我处于一系列类型的循环中。
我只有类型列表给出了e
public static loopList()
{
List<Type> modelListSorted = ModelListSorted();
foreach (Type currentType in modelListSorted)
{
string 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;
}
最佳答案
这里的挑战是涉及两个反射步骤,一个反射步骤调用通用的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;
}
如您所见,我首先通过调用代表通用方法
ObjectSet
的MethodInfo
来获得CreateObjectSet<T>()
。然后,找到通用类型PropertyInfo
的EntitySet
属性的ObectSet<T>
。最后,获得该属性的值和获得的EntitySet
的名称。为此,我首先为
MethodInfo
(没有参数的)获取CreateObjectSet<>()
和ObjectSet<>
类型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 ...”方法完成。var oc = (dbContextInstance as IObjectContextAdapter).ObjectContext;
var entityType = typeof(UserRole);
var name = GetObjectSetName(oc, createObjectSetMethodInfo, objectSetType, entityType);
在EF 6中,这些应为
using
:using System.Data.Entity.Core.Metadata.Edm
using System.Data.Entity.Core.Objects
using System.Data.Entity.Infrastructure
using System.Linq
using System.Reflection