Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework EF在运行时从类型获取数据库集名称_Entity Framework_Type Conversion_Dbcontext_Typeof_Dbset - Fatal编程技术网

Entity framework EF在运行时从类型获取数据库集名称

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

目的: 我需要获取数据库集的名称实体的名称 typeof(UserAccount)=“UserAccounts”。 但在运行时,我需要一个用于循环的公共类型,因此不知道示例“UserAccount”。 只有typeof中的“名称”吗

我已经用一些实体创建了一个DbContext。 我已经在谷歌上搜索了一段时间,但它似乎不适合我,因为类型转换

请参阅本说明底部的我的方法GetDbSetName

我对EF这个东西很陌生-所以请帮助med解决我的问题,如下所述;-)

公共类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