2013-10-04 40 views
3

所以我有一個LINQ到SQL的dbml文件中的情侶對錶:LINQ到SQL不會序列化的引用

my dbml layout

我已成立了一個WCF REST得到端點用戶。我不能把它傳回的結構像這樣的JSON:

{ 
    ID: '123', 
    Username: 'fdsaf', 
    ... 
    Role: 
    { 
     ID: '123', 
     ... 
    } 
} 

如果我設置從「無」的DBML序列化模式爲「單向」,我可以得到用戶對象沒有作用。如果我將序列化模式設置爲none並刪除關聯,則還可以獲取用戶對象。作爲一個完整性檢查,我也可以在沒有用戶的情況下獲得角色。當我嘗試將包括參考,它試圖序列兩次(在調試器),我得到什麼似乎是在客戶端上一個成功的函數調用後出現以下錯誤:

client error

此外,我可以得到什麼我要找的,如果我打開的關聯,把內部的子屬性的訪問。但是,我有時想要將角色傳遞給用戶集合,所以這不夠。

insufficient workaround

我包括這一塊的信息,因爲它似乎表明串行試圖序列化用戶>角色>用戶>角色......等等,這顯然是不夠的。但是,在圓形和零級深度參考之間必須存在中間立場。下面

代碼:

using (DataContext context = new DataContext()) 
{ 
    DataLoadOptions opts = new DataLoadOptions(); 
    opts.LoadWith<User>(u => u.Role); 
    context.LoadOptions = opts; 

    return context.Users 
     .Where(u => u.ID == id) 
     .Where(u => u.Hash == hash) 
     .FirstOrDefault(); 
} 
+0

這種方法不使用JSON工作。 –

回答

1

我想創建一個映射的對象,而不是用戶,並給它的角色數組,這主要是因爲你傳回原始數據對象,其中包括密碼和原始哈希一個用戶。然後,您可以隱藏這些在映射

對每一個模型, UserObject與角色的一兒一 RolesObject與用戶的一個孩子。

另外,有一個屬性,你可以序列化每個將返回僞對象 所以角色可以是一個ID /字符串數組,因此用戶(所以可以忽略關係的序列化和序列化,而不是圓形參考問題)

+0

雖然這幾乎使得使用linq-to-sql無用。 –

+1

不是,你在查詢一個關係數據庫,如果你想序列化出所有東西都會給你循環引用。 的XML不能由於文檔類型的自然循環引用,所以你有你如何通過傳遞物品,包括兒童,他們必須被孤立,除非你序列不同的項目沒有關係信息的對象來獲得創意將有聯繫的層次結構,並拋出一個不穩定 的EntityFramework會做同樣的問題,其實我敢肯定,幾乎所有的ORM會。這不是一個圖書館的具體問題。你得到SOAP同樣的問題 – finman

+0

你需要一個專門的序列化對象要做到這一點(你可以保留IDS罰款,但序列化對象不能包含父對象的引用,你與用戶/角色目前做) LINQ2SQL可能有一種方法可以將屬性添加到父/子以不序列化該項目,但我不知道它。斷開連接的映射類可以避免公開敏感項目以及控制每個集合的公開關係,您將返回鏈接的非活動角色。簡單地說...你不使用LINQ to sql來序列化一個對象,因爲它是一個查詢工具 – finman