2009-04-16 118 views
2

我通過WCF序列化一個linq對象。 dbml被設置爲單向序列化。使用WCF序列化linq實體

我的對象非常簡單:預算具有BudgetLineItems的集合。每個BudgetLineItem都有一個ItemCateogry。

Budget/BudgetLineItems序列化正常。但是,每個BudgetLineItem上的ItemCateogry都不會。我注意到默認情況下,linq沒有在每個BudgetLineItem的ItemCategory上添加一個[DataMember]。我手動添加了它,並用[IgnoreDataMember]刪除了ItemCategory實體上的任何可能的循環引用。不過,不是運氣。

問題:

  1. 能WCF,默認情況下,序列化多到一對一的關係,還是我只是失去了一些東西?我知道序列化數據對於每個BudgetLineItem都會有相同的重複ItemCategory數據,但這很好。

  2. 我需要爲此自定義DataContractSerializer嗎?

**編輯**其實,沒有工作(添加[DataMember]),我只是沒有更新客戶端(杜)的服務引用。

新問題:有沒有辦法告訴linqtosql設計器在設計器生成的實體上維護這些[DataMember]和[IgnoreDataMember]字段?否則我需要每次保存dbml時更新它們。

回答

3

你是否成功地爲你的LINQ 2 SQL對象序列化了WCF?

當我嘗試了這個(非常不情願,請參閱下面爲什麼),它真的倒了下來,我的L2S實體中有指向子女的關係,然後孩子指向父母,顯然在建立WCF對象,它無法以這種方式無限遍歷樹,[我記得最好]導致了一個溢出異常,所以我基本上說的是要小心,如果你走這條路!

繼續關注Michael的文章,我會建議將您的WCF對象轉換爲POCO(自定義模型表示)。我很高興上述不起作用,因爲我總是希望製作一個傳輸乾淨的數據子集的自定義WCF對象,正是WCF請求需要的,然後它不包含一堆多餘的數據發送數據,我相信你的L2S實體有很多。我試圖直接通過網絡發送我的L2S數據的實際原因是因爲我必須製作一個使用某些「規則」的引擎,這些規則存儲在大約4個關係數據庫表的關聯中,並且不可維護一個單獨的WCF對象。

所以最後我做的是擴展自定義代碼gen類,使其包含[DataContext]的Wcf.cs,然後克隆屬性爲L2S類 - > WCF自定義類。

它的工作完美到底,這是cloning procedure I used with instructions on my blog

我對此感到滿意,不覺得有不良做法涉及。希望這可以幫助。

+0

感謝您的信息。爲了成功的序列化,我們必須添加一個[DataMemberIgnore]給任何遞歸的道具(通常是引用回父節點),因爲那些將不會序列化。這涉及到更改dbml,這當然會在每次更改時被覆蓋。它可以工作,但不是非常無縫。如你所知,序列化的對象是_huge_。 幸運的是,這僅僅是一個概念驗證(SQLRS2008消耗WCF層給我們的服務擺脫了redudant邏輯) – ericvg 2009-04-21 16:17:40

1

你不應該用WCF發送LINQ實體。取而代之的是製作自己的業務數據模型並通過電報發送。如果你曾經改變你的數據庫,你不想改變每一個與你的服務連接的程序

+0

同意,但爲了這個特定項目的目的,我們正在交易。 – ericvg 2009-04-16 16:58:39