2013-08-29 39 views
0

我使用實體框架。我創建實體模型。我想在運行時從DbContext獲取所有類型的實例。如何從ObjectContext中提取類型列表?

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)); 
    } 
} 

回答

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。如果您的實體在另一個程序集中定義,則需要更改此實體。

+0

ElementType在彙編中具有FullName但不等於完整名稱的類型。它的問題。示例ElementType =「WdmModel.display_type」,但是我確實在EditorX.EntityModel命名空間中有一個類display_type – isxaker

+0

@Mikhail我編輯了答案。 –

+0

我的答案也在工作。 Thnks – isxaker

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); 
} 
相關問題