我使用实体框架。我创建了实体模型。我想在运行时从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));
}
}
答案 0 :(得分: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
。如果您的实体在另一个程序集中定义,则需要更改它。
答案 1 :(得分: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);
}