目的:
我需要获取实体的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;
}


如您所见,我首先通过调用代表通用方法ObjectSetMethodInfo来获得CreateObjectSet<T>()。然后,找到通用类型PropertyInfoEntitySet属性的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

09-06 01:43