2012-04-10 55 views
-2

我檢查了代碼示例http://msdn.microsoft.com/en-us/library/dd728281.aspx#Y0,發現一件有趣的事情:如果我們從OrderItemData類中刪除Public ReadOnly Property Items(),則該服務會顯示一個錯誤。即使我們不嘗試訪問商品,也只能使用訂單。 有人可以解釋爲什麼這個屬性是需要的嗎?Web服務中所需的屬性

編輯:澄清:財產不直接使用。我將它從代碼中刪除,它編譯成功,但服務返回請求錯誤:「服務器在處理請求時遇到錯誤。請參閱服務器日誌以獲取更多詳細信息。」並沒有拋出異常。

我認爲服務出於某種原因可能需要IQueryable(Of Item)屬性。即使屬性返回Nothing,該服務將重新開始工作:

Public ReadOnly Property Items() As IQueryable(Of Item) 
    Get 
     Return Nothing 
    End Get 
End Property 
+0

該屬性正在課堂內使用。這就是爲什麼它是需要的。 – Oded 2012-04-10 10:23:18

+0

你能指定它的用途嗎?我從代碼中刪除它,它編譯成功,但服務返回請求錯誤。如果我看到編譯時錯誤,我不會問這個問題:)。 – MyUserName 2012-04-10 10:32:19

+0

返回的錯誤是什麼? Web服務拋出什麼異常? – Oded 2012-04-10 10:33:22

回答

2

當WCF數據服務使用反射提供商(這是樣品做什麼),每個實體類型必須滿足以下條件:

  • 它必須是一個公共類的一些公共屬性
  • 它具有定義(通過公約或通過DataServiceKey屬性)
  • 必須有類型的IQueryable的公共屬性的關鍵屬性,其中T是該實體在上下文類中鍵入。

如果您刪除Items屬性,則違反了上述規則3。因此類型Item不再被識別爲實體類型(它在內部被視爲複雜類型),但是它在Order類中用作集合的項類型。這意味着它必須是導航屬性,但這需要項目類型爲實體。

如果您正在尋找某種遏制措施(其中的項目只能通過它們所屬的訂單訪問),WCF DS當前不支持此功能。

+0

非常感謝許多!這正是我想知道的。順便說一句:你知道爲什麼Visual Studio在發生這種錯誤時沒有發現任何異常嗎? – MyUserName 2012-04-10 13:24:49

+0

關於VS異常處理(只是一個猜測):你有沒有在調試器設置中打開「只是我的代碼」?這個異常發生在一個callstack上,它與你寫的代碼沒有任何關係。 – 2012-04-11 05:40:03