2012-02-15 51 views
0

當我從數據庫中檢索實體時,我正在使用包含「父屬性」的動態方法。但是,由於它檢查屬性是值類型(或字符串)還是可枚舉的東西(不包括那些),它還將包括被定義爲複雜類型的實體。這將導致例外。實體框架4.3 POCO包含在複雜類型拋出異常

是否有可能檢查一個實體是否被定義爲複雜類型?

請參見本文的示例代碼:

public IEnumerable<object> LookupExtent(Type type) 
{ 
     var set = Set(type); 

     DbQuery q = null; 

     foreach (var prop in type.GetParentProperties()) 
     { 
      if (q == null) 
       q = set.Include(prop.Name); 
      else 
       q = q.Include(prop.Name); 
     } 

     return q.ToObjectArray(); 
    } 

PS:是的,我知道,如果我沒有父屬性,這將失敗...

回答

1

它有更多的問題。如果您的實體包含一些額外的未映射特徵,會發生什麼?您可以要求EF爲您提供所有映射導航屬性的名稱。從EF元數據獲取信息是很有限的,但這是可能的。嘗試這樣的事情(代碼期待您正在使用的DbContext API,但它可以很容易地改變ObjectContext的API):

ObjectContext objectContext = ((IObjectContextAdapter) dbContext).ObjectContext; 
MetadataWorkspace workspace = objectContext.MetadataWorkspace; 
EntityContainer container = 
    workspace.GetEntityContainer("NameOfYourContextClass", true, DataSpace.CSpace); 
EntitySet entitySet = 
    container.GetEntitySetByName("NameOfYourPropertyExposingDbSetOnTheContext", true); 
IEnumerable<string> navigationPropertyNames = 
    entitySet.ElementType.NavigationProperties.Select(n => n.ToString()); 

的關鍵是提供正確的名稱爲GetEntityContainerGetEntitySetByName,它也是之間的主要區別先編碼,然後db/model。如果您先使用代碼,則這些名稱遵循一些約定。如果您正在使用EDMX,則可以在設計器中控制這些名稱。

無論如何,這個automagic包括是你應該避免使用的東西。僅包含您真正需要的數據,並明確地做到始終顯示complexity of the query

+0

我明白你的顧慮,我想達到的不是「默認使用案例」。我只會在非常特殊的情況下使用這個automagic。默認情況下不包括任何父母或孩子的屬性,並且必須明確說明這些屬性的加載情況。當我回到辦公室時(下星期一),我會試一試你的代碼並將其標記爲答案,所以你必須等一下;-) – UrbanEsc 2012-02-16 09:58:12