2013-06-02 58 views
0

我建立我的模型使用ODataModelBuilder,我試圖創建導航屬性,但在元數據我沒有看到任何foreginkey指示,在我的解決方案中我不使用EF,所以沒有外鍵屬性,是否有可能通過代碼添加它?WebAPI - odata服務添加ForeignKey

+0

只是澄清一下:你的意思是說,在$ metadata文檔中,你希望看到'Association'中的'ReferentialConstraint'元素?或者,你只是想弄清楚如何使用ODataModelBuilder在兩個實體集之間創建導航? –

+0

我能夠創建導航屬性,當我用wcf數據代理測試它時 - 當我查詢主要對象的相關實體是空的,雖然我可以在嗅探器然後我可以猜測它與外鍵相關 –

+0

通過wcf數據代理,我猜你的意思是DataServiceContext類(和相關的類)?我想我現在明白你的問題了,我不認爲它與外鍵有關(我會在下面回答)。但我很困惑,你說當你嗅探有效負載時,相關的實體數據顯示出來 - 你的意思是你看到了與相關實體的鏈接?或者屬於相關實體的實際數據?我期望,除非你在請求URI中包含'$ expand'查詢選項,否則相關實體的實際數據不應該在那裏。 –

回答

2

正如您在您的評論中澄清的那樣,您要添加外鍵信息的原因是因爲當您查詢主實體時,您的客戶端應用程序不包括相關實體。我不認爲外鍵是這裏的問題。

作爲示例,我將使用兩種實體類型:CustomerOrder。每個Customer都有一些關聯的Order s,所以我有一個導航屬性Customer,稱爲Orders,指向Order的集合。如果我向/MyService.svc/Customers(1)發出GET請求,服務器將回復所有的Customer的信息以及指向相關Order實體的URL。默認情況下,我不會在相同的有效載荷中獲取每個相關的Order的數據。

如果你想Customers(1)請求包括其所有相關Order S的數據,你會在$expand查詢選項添加到請求URI:/MyService.svc/Customers(1)?$expand=Orders。使用WCF數據服務客戶端(DataServiceContext),你可以用.Expand()做到這一點:

DataServiceQuery<Customer> query = context.Customers.Expand("Orders"); 

然而,OData的的WebAPI目前不支持$expand(最新的每晚構建做了,所以這將很快改變)。

另一種方法是提出一個單獨的請求來填寫缺少的訂單數據。您可以使用LoadProperty()方法來做到這一點:

context.LoadProperty(customer, "Orders"); 

的LoadProperty方法應與工作的WebAPI,因爲它代表今天。

我知道這並不回答你原來的問題,但我希望解決你的意圖。 *在JSON中,這是WebAPI OData服務的默認格式,網絡上不會顯示任何鏈接,但它們仍「存在」。預計客戶端可以自己計算它們,WCF數據服務客戶端可以完成這些工作。

+0

基本上我使用擴展和夜間生成,我用BreezeJS測試它 - >並且它填充了相關實體的字體,我將嘗試用wcf客戶端進行擴展 –

+0

我已經用wcf測試客戶端進行了測試,負載屬性工作但展開沒有 –

+0

$是否從瀏覽器擴展工作?我認爲「如何在WebAPI中啓用$ expand」是一個單獨的問題。很高興LoadProperty正在爲你工作:) –