2013-09-27 28 views
2

我還有導航屬性的另一個問題,但這次我的配置是WCF數據服務+ EF。breezejs:導航屬性創建但未填充數據

基本上,元數據看起來不錯,我有參考約束,關聯等......我已經在模型中設置了[ForeignKey]屬性。

在客戶端創建的導航性能,但是當數據被檢索(使用$擴展),收集未充滿雖然數據肯定是由服務器返回:

enter image description here

的這裏的關聯是OpenPosition上的tasks_id和Mandate上的id之間的關係。

我注意到OpenPositions集合中的Mandate實體包含__deferred和實體的uri。我沒有看到WebApi,所以也許這就是問題,或者這只是正常的行爲。

有什麼我失蹤了嗎?

EDIT

客戶機側查詢是:

var query = breeze.EntityQuery.from("Mandates").inlineCount().expand("OpenPositions"); 
    return manager.executeQuery(query.using(service)).then(function (result) { 
     logger.info(result); 
    }).fail(function (error) { 
     logger.error(error); 
    }); 

編輯2

原因導航屬性未填充是因爲,在WCF的DataService的情況下,導航屬性作爲一個對象返回,其中包含一個名爲results的Array屬性。

而在WebAPI的情況下,導航屬性作爲數組返回。

請注意,在這兩種情況下,都使用相同的數據模型(EF上下文)。

查看截圖:

WCF:

enter image description here

的WebAPI:

enter image description here

但微風否則期望一個數組,它只是忽略了導航屬性並返回null:

// needed if what is returned is not an array and we expect one - this happens with __deferred in OData. 
     if (!Array.isArray(relatedRawEntities)) return null; 
+0

您的客戶端EntityQuery看起來像什麼? –

+0

當然,看我的更新。就像我說的,數據從服務器回來。導航屬性存在於任務實體中,但它仍然是空的,而所有其他屬性都是正確填充的。 – Sam

回答

2

好的,最後它的工作:)我現在使用github上的最新提交的breezejs,這解決了我的問題。在我看來,通過WCF的微風從來沒有工作到現在與ODATA2。的ODATA規範是清楚的是:

  • ODATA V1:集合被表示爲一個數組
  • ODATA V2:集合被表示爲包含數組的對象。

在使用github版本的breezejs之前,我可以使用它的唯一方法是在datajs中將MAX_DATA_SERVICE_VERSION指定爲1.0。

無論如何,這一切都很好。我不能等待微風發布:)順便說一句,我可能會爲NHibernate放棄OpenAccess。 NH WebAPI控制器與EF WebAPI控制器一樣完整嗎?

0

您使用的是「WebApi」數據服務適配器還是「OData」數據服務適配器?一般而言,除非您明確通過OData公開您的數據,否則您應該使用「webApi」數據服務適配器。 「webApi」適配器是默認的,所以我會嘗試刪除任何提及「OData」的「initializeAdapterReference」調用。

+0

我使用ODATA數據服務適配器,因爲在後端我使用WCF數據服務。如果我切換到WebApi數據服務適配器,那麼當我嘗試訪問元數據時,我會得到一個404。我雖然WebApi數據服務適配器是爲人們在後端正確使用WebApi服務時保留的嗎? – Sam

+0

是的,這是正確的。對困惑感到抱歉。我應該更仔細地閱讀你的電子郵件。你提供什麼版本的OData? –

+0

沒有問題,它的版本是3.0 – Sam

0

作爲後續行動,這個問題就是:

- 附經典OData服務,導航性能都嵌入在一個名爲「結果」的對象。

enter image description here

而用的WebAPI服務,導航屬性只是陣列。

enter image description here

然後在微風代碼的一些點有以下測試:(!Array.isArray(relatedRawEntities))

// needed if what is returned is not an array and we expect one - this happens with __deferred in OData. 

如果返回NULL;

並且在經典ODATA服務的情況下,它顯然返回null,並且未填充導航屬性。

我不知道如何讓自己做得更清楚。它看起來不像我的元數據有問題,但更像是微風中的錯誤。

你能證實我說的話有道理嗎?我們可以做些什麼嗎?

+0

您所看到的是OData v 2.0和OData v 3.0之間的差異。目前Breeze僅支持OData v2.0。我們將在下週初的下一個版本中支持第3版。現在,只需使用DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2公開您的服務; –

+0

我希望它是那麼容易,但我懷疑它是導航屬性沒有填充的原因:(我已經在datajs中將MAX_DATA_SERVICE_VERSION設置爲「2.0」,並且在服務器端將MaxProtocolVersion設置爲V2,所以也許它只是不受支持我可以期待這一點在下週的發佈中得到解決嗎?:) – Sam

+0

對不起,但我不能在我們的任何型號上用OData v2重新報道您的問題。所以我想知道還有什麼不同。 –