2012-11-19 80 views
0

我想獲取導航屬性的外鍵值,而無需定義外鍵屬性(導航屬性加載前)。EF 5 - 獲取導航屬性的外鍵值

爲什麼?

我們緩存(例如)所有「狀態」 - 對象應用程序範圍內(是的,我們不能使用枚舉爲此)。當我們將具有導航屬性的對象加載到此狀態類時,存儲庫會將該屬性設置爲緩存項目。

我可以去一個外鍵屬性,但由於EF知道關鍵,我想從EF(也許通過RelationshipManager或導航屬性的DBEntityReference)得到它,但我似乎無法找到它。

:我第一次使用EF5,代碼在.NET 4.5

+0

也許我不明白,但只是在你的實體'StatusId'屬性不夠? –

+0

可能是快捷方式的後備解決方案。但是,當使用外鍵屬性Id時,您需要保持屬性和導航屬性同步,或者找到一種方法將其從api中隱藏(通過使用具有訪問器屬性的內部類)。這一切看起來有點亂,恕我直言,一些很簡單。 – Cohen

+0

使用EF時,顯示原始FK字段(稱爲_foreign key associations_)是很常見的。 EF在檢測到更改時使它們與FK參考保持同步。 –

回答

0

我發現從Slauma答案(#2),(不知道我是否應該紀念這個作爲重複?)。我不得不改變代碼來處理一個具有多重關係的實體。很多東西還難看,但它的工作原理:)

RelationshipManager relMgr = ((IObjectContextAdapter)context).ObjectContext.ObjectStateManager.GetRelationshipManager(document); 
IEnumerable<IRelatedEnd> relEnds = relMgr.GetAllRelatedEnds(); 
IRelatedEnd relEnd = relEnds.Where(r => r.RelationshipName.EndsWith("Document_Status")).Single(); 
EntityReference<Status> entityRef = relEnd as EntityReference<Status>; 
var entityKey = entityRef.EntityKey; 

short statusId =(short)entityKey.EntityKeyValues[0].Value; 

唯一的缺點是,(據我可以告訴。希望有人找到一個更好的辦法?)這些信息,只要你脫離丟失實體或當您使用AsNoTracking()加載它時。