2011-04-17 29 views
3

比方說,我有一個關係數據庫的表:OrderableCategories和Orderables。它們與一個OrderableCategory附加到多個可訂購商品的一對多關係中。因此,LINQ中的OrderableCategory實例具有成員:ID,NameEntitySet<Orderable> Orderables。雖然通過WCF發送(wsHttpBinding,如果它很重要),EntitySet被轉換爲簡單的Orderable[]Orderable實例還包含一個名爲OrderableCategory的成員,該成員只是此可訂購類別的一個實例。雖然通過WCF發送,但我猜想會發生類似這樣的情況:Orderable實例使用此類別的字段填充其OrderableCategory實例,但其Orderable[]也填充了此類別中的其他可訂購設備。這些可執行代碼將其OrderableCategory再次填充此類別,以便我理論上可以調用(對於接收的可訂購o):o.OrderableCategory.Orderables[0].OrderableCategory.Orderables[0]. (...)等等。我只是猜測服務器進入了一個無限循環,並且當消息大小超過配額時,它會斷開連接,並且我看到服務關閉的異常。我怎樣才能避免這種情況,並在我的數據庫中具有關係的好處?我認爲我的懷疑是正確的,因爲當我禁用其中一個屬性(在LINQ類設計器中使其成爲內部)時,數據僅填充爲「單向」,而Orderable已不再是其OrderableCategory成員,它可以工作。但我想知道這是否可以在不損害財產的情況下實現。當通過WCF發送對象時,LINQ to SQL DataContext中的關係成員如何處理?

回答

0

這必須通過標記具有DataContract屬性的實體並將其IsReference屬性設置爲true來處理。這將指示DataContractSerializer跟蹤引用,而不是像您所描述的那樣跟蹤序列化對象。

Linq-to-Sql designer/SqlMetal應該通過將Serialization Mode設置爲Unidirectional來爲您做到這一點。

0

如果您通過WCF發送實體,當然,延遲加載等漂亮功能會出現在窗口外面。

你基本上需要決定你想使用它的兩個選項:

  • 如果你問的實體OrderableCategory,您可以僅返回它的基本「原子」的屬性,例如ID, Name等。好處是更小的尺寸 - 你發回的數據較少

  • 或者:如果你問的實體OrderableCategory,你可以回到它的基本性能加上這個類別包含您可以加載的Orderables整個列表,並同時返回;好處:您可以立即獲得這些數據,但是不利的一面是,您必須發送更多數據。

很顯然,你不能真正做到無限渴望預加載 - 在某些時候,你必須停止,並留下更多的數據檢索到以後的WCF服務調用。如果您對此感興趣,您的客戶必須特別明確地詢問另一個OrderableCategory