2015-05-12 62 views
0

我是EF新手,遇到了障礙。我試圖獲取從基類型派生的實體類型的導航屬性列表。我打算使用....派生類型的實體框架導航屬性

ObjectContext objectContext = ((System.Data.Entity.Infrastructure.IObjectContextAdapter)context).ObjectContext; 
var entitySetElementType = objectContext.CreateObjectSet<DerivedType>().EntitySet.ElementType; 
foreach(var navigationProperty in entitySetElementType.NavigationProperties) 
{ //need PropertyInfo here} 

這是我學習的地方我無法獲得派生類型的ObjectSet。拋出的異常是

「沒有指定的實體類型 ‘SurveyDALv2.Model.Correspondence’定義EntitySets。如果 ‘SurveyDALv2.Model.Correspondence’是派生類型,使用鹼 類型,而不是「。

我明白我可以使用

objectContext.CreateObjectSet<BaseType>().OfType<DerivedType>() 

獲得派生實體的的ObjectQuery但是,這不符合獲得導航屬性的列表(除非我失去了一些東西)幫助。我沒有看到如何訪問派生實體類型的EntitySet.NavigationProperties。

任何幫助,非常感謝。

+0

決不核心上下文嘗試過,但你可以試試這個: 'CreateObjectSet ().OfType ()'而不是'CreateObjectSet ()'? –

+0

謝謝,但我正在尋找派生類型實體上定義的導航屬性的列表。這(http://stackoverflow.com/questions/17886725/ef5-how-to-get-list-of-navigation-properties-for-a-domain-object工作正常,以獲得導航屬性的列表,除非它是派生的類型實體)(從marsman的答案) – Michael

回答

0

我設法讓下面的代碼工作,我希望它能幫助你。

ObjectContext objectContext = ((System.Data.Entity.Infrastructure.IObjectContextAdapter)context).ObjectContext; 
    EntityContainer container = objectContext.MetadataWorkspace.GetEntityContainer(objectContext.DefaultContainerName, DataSpace.CSpace); 

    //Only works if you keep the default entity associations names pattern 
    //ie: ClassName.NavigationProperty 
    var t = container.AssociationSets.Where(a => a.Name.Contains(typeof(DerivedType).Name)); 

    foreach (AssociationSet navigationProperty in t) 
    { 
     String p = navigationProperty.Name; 
     var propInfo = typeof(DerivedType).GetProperty(p.Substring(typeof(DerivedType).Name.Length+1)); 
    } 
+0

這似乎對我的大多數實體類都有效,但我有一些擴展其他實體名稱的實體名稱。我有一個函授類和函授鏈類,和函授鏈類。所以我的班級名稱阻止'Where(a => a.Name.Contains'只返回正確的關聯集合。 T – Michael

+0

這雖然有幫助。 我真的只是試圖發現並重新連接實體的導航屬性添加和保存更改之前的上下文我一直在添加重複實體時,因爲我正在處理一個分離的上下文我只是要編寫一些類型特定的東西來附加導航屬性我知道存在。謝謝 – Michael

+0

考慮到你的類名,你可以使用類似於'Where(a => a.Name.Contains(typeof(DerivedType).Name +「。」))''注意:'''可以替換爲字符串中的'_' 無論如何,如果你遇到重複實體的問題,也許你不會以正確的方式檢索你的實體(包括延遲加載),我想你沒有添加FK屬性s到你的模型,允許你根據他們已知的FK加載你的導航屬性。 –

1
public EntityType ElementType(Type entityType) 
{ 
    var type = ObjectContext.GetObjectType(entityType); 
    var objectContext = ((IObjectContextAdapter)this).ObjectContext; 
    EntityType elementType; 
    if (objectContext.MetadataWorkspace.TryGetItem(type.FullName, DataSpace.OSpace, out elementType)) 
    { 
     return elementType; 
    } 
    return null; 
}