0

我使用实体框架。我创建实体模型。我想在运行时从 DbContext 获取所有类型的实例。

public class MyClass
{
   WdmEntities _context =  = new WdmEntities();
   ObjectContext objContext = ((IObjectContextAdapter)_context).ObjectContext;
   EntityContainer container = objContext.MetadataWorkspace.GetEntityContainer(objContext.DefaultContainerName, DataSpace.CSpace);
   //even if c=>c.FullName
   List<string> nameTypes = container.BaseEntitySets.OfType<EntitySet>().Select(c=>c.Name).ToList();
   List<Type> types = new List<Type>();

   foreach(var name in nameTypes)
   {
    //.GetType return null
    types.Add(Type.GetType(name));
   }
}
4

2 回答 2

1

尝试以下操作:

MyContext _context = new MyContext();
ObjectContext objContext = ((IObjectContextAdapter)_context).ObjectContext;
var nameTypes = objContext.MetadataWorkspace.GetItems<EntityType>(DataSpace.OSpace);
List<Type> types = new List<Type>();

foreach (var entityType in nameTypes)
{
    var type = Type.GetType(entityType.FullName + "," + Assembly.GetExecutingAssembly().FullName);
    types.Add(type);
}

通过使用该GetItems<EntityType>方法,您可以直接从传递给此方法的参数中加载所有实体,ObjectContext.该参数指定您要查找实体的位置。您应该使用该OSpace值从对象模型中请求实体类型。这将映射到 CLR 类型,除非这些类型是嵌套的。在这种情况下,您将获得一个包含所有外部类型的组合名称。

Type.GetType需要对象的全名和程序集的全名。在这个例子中,我使用Assembly.GetExecutingAssembly. 如果您的实体是在另一个程序集中定义的,您需要更改它。

于 2013-08-29T11:14:24.203 回答
0
MyContext _context = new MyContext();
ObjectContext objContext = ((IObjectContextAdapter)_context).ObjectContext;
var nameTypes = objContext.MetadataWorkspace.GetItems<EntityType>(DataSpace.OSpace).Select(c => c.FullName).ToList();
List<Type> types = new List<Type>();

foreach (var name in nameTypes)
{
    var type = Type.GetType(name);
    types.Add(type);
}
于 2013-08-29T11:35:23.973 回答