2011-03-23 175 views
2

我一直在使用OData一段時間,並且發現它是設置我的服務器的絕佳工具。今天我遇到了一些我從未見過的事情,這絕對讓我感到困惑。

我在客戶端上使用.Expand在獲取報表時請求報表的數據樹。我在原型中使用了確切的查詢,並且它完美地工作(即完全水合)。當我使用Fiddler發送查詢時,響應數據包是完美的,幷包含我正在查找的所有數據。

問題是沒有任何擴展屬性已被客戶端水合(服務引用與當前服務完全保持最新)。爲了試圖弄清楚發生了什麼,我將範圍縮小到了一個屬性,但它仍然不起作用。

var report = (serviceContext.Reports.Expand("ReportAreas").Where(r=>r.ReportID==reportID)).SingleOrDefault(); 

給我的報告,但ReportAreas包含0個項目。如果我然後嘗試:

serviceContext.LoadProperty(report,"ReportAreas"); 

然後ReportAreas包含20左右的項目。

這讓我非常瘋狂,因爲Expand正在爲不同的對象樹(不同的查詢,但功能相同的代碼)工作,沒有任何問題。有沒有人有任何建議,我可以如何解決這裏究竟發生了什麼?

更新:

這可能是wierder並建議我的客戶的OData一個bug這個今天一些新的信息。我發現只有一部分Report對象沒有被填充擴展屬性。數據庫中的大部分報告都非常好。也就是說,如果我要求擴展ReportAreas的所有報告(而不是精煉爲單個報告ID),則大約有80-90%的ReportAreas的非零計數爲0,其餘爲0.

如果報告沒有任何屬性被填充(null或0 count)實際的屬性對象被實例化並且它們的屬性被設置(來自服務引用的Reference.cs文件中的斷點),例如屬於ReportArea對象的ReportID,PropertyAreaID和History值在查詢分辨率期間設置了16次,但ReportAreas列表在請求時計數爲0。當我使用_service.LoadProperty時,它返回16個ReportAreas。

它在Expand查詢中引用了一個參考不匹配的問題,但它過於一致而無法成爲一個簡單的問題。工作總是有效的報告和不起作用的報告永不工作。真的希望有人能幫助我找出這個,所以我可以移動到一些有用的編碼...

+0

您可以嘗試Fiddler並查看向服務器發送了什麼查詢(URL),以及響應是否包含擴展數據。 – 2011-03-23 14:12:44

+0

根據第2段「當我使用Fiddler發送查詢時,響應數據包是完美的(即包含所有擴展數據)」 – 2011-03-31 06:57:40

+0

我明白,當您從Fiddler手動發送請求時,它會起作用。我問是否可以使用Fiddler查看客戶端應用程序發送的請求,尤其是請求的URL和響應。 – 2011-03-31 10:41:30

回答

0

的解決了這個問題(至少直到我更好地理解它)是設置

serviceContext.MergeOption = MergeOption.OverwriteChanges; 

我有人告訴我這與客戶沒有補充鏈接,如果他們已經被追蹤。我會更新這個答案,如果我發現更多/更好地理解問題。

+0

請參閱http://msdn.microsoft.com/zh-cn/library/gg602811(v=vs.103).aspx 「默認情況下,客戶端僅將響應Feed中的條目實現爲實體的對象DataServiceContext沒有被跟蹤,這意味着已經存在於緩存中的對象的改變不會被覆蓋,這種行爲是通過爲查詢和加載操作指定一個MergeOption值來控制的。 – 2013-02-24 20:24:46

+1

這對最初的問題沒有影響。即使特定對象先前已被上下文加載(他們沒有加載),我仍然期望它們出現在ReportAreas集合中。否則數據庫的引用完整性會被完全拋出,因爲我可能會嘗試重新插入服務器上已有的對象,這是因爲當我從服務器加載時,這些對象在客戶端上不存在。 – 2013-02-27 02:02:23