2009-11-17 65 views
4

我目前正在使用實體框架(與.NET Framework版本3.5 SP1一起打包的版本)和大量AJAX基於的功能,我正在客戶端使用jQuery並在服務器端使用ASP.NET WebMethods。通過ASP.NET在JSON中添加實體框架實體(一對多)WebMethod

我通常創建使用接受的實體作爲參數一個WebMethod新的實體如下:

[WebMethod] 
public static void Add(User user); 

調用此方法時,我組裝類似的實體的對象(在性質方面)在JavaScript和將它作爲JSON字符串傳遞。但是,當嘗試以多對多關係傳遞相關實體時,我遇到了一個問題。假設一個用戶實體與Flight實體有一對多的關係 - 添加一個擁有多個(新)航班的新用戶證明是有問題的。以下方法:

this.user.Flight = []; 
var x = new Object(); 
// Code here to populate x's properties 
this.user.Flight.push(x); 
// Repeat again for more flights 

結果在ASP.NET錯誤(在反序列化階段),指出列表不能轉換爲EntityCollection。

我又試圖這種方法:

this.user.Flight = {}; 
var x = new Object(); 
// Code here to populate x's properties 
this.user.Flight.firstFlight = x; 
// Repeat again for more flights 

在這種情況下,將WebMethod成功調用,但丟失的航班完全(調用user.Flight.Count()中的WebMethod返回0)。

有沒有人有任何想法如何我可以將一個EntityCollection中的多個航班傳遞給WebMethod?

+5

在這裏,只是因爲你的用戶名讓我發笑纔得到讚揚。 – 2009-11-17 13:25:51

+1

+1確實,同上。 – grenade 2009-11-19 13:23:31

+0

我在代碼中看不到EntityCollection。你能否提供額外的澄清/代碼剪輯? – 2009-11-19 16:44:17

回答

1

爲什麼不返回飛行是清單作爲第二個參數,然後將它們添加到您的方法中的用戶

我不使用[的WebMethod]與EF參數,我一般通過POD結構作爲參數,所以我從來沒有這個問題....

+0

最後,我確實將它作爲一個單獨的參數傳遞並按照您的說法添加它。這工作得很好,但我想知道是否有一個「適當」(或至少更優雅)的方式。 – 2009-11-20 11:39:07

2

你可以使用有一定難度內置串行器,同時試圖直接使用您的EF實體類。即使你能夠從一個javascript數組反序列化爲一個EntityCollection,你也無法走另一條路(EF object graph to js obj):你會得到着名的「循環引用」錯誤。

我有很多項目,我使用EF和Web服務(但我還沒有使用動態數據的東西)。可能還有其他一些很好的選擇供您嘗試。您可以創建代表實體類的所有屬性和關係(但不包含方法或其他代碼)的DTO或POD類(「數據傳輸對象」或「普通舊數據」)類。這些可以很容易地序列化和反序列化,並通過電線傳遞。儘管如此,您仍可能會收到循環引用錯誤。對於那些,你可以使用支持循環引用的Json.NET做你自己的序列化。您的服務必須修改才能返回字符串,並且您必須在JavaScript調用站點上將json字符串評估爲對象字面值。這並不是太多工作。

您可以使用DataSvcUtil.exe來創建您的DTO類。

所有的說法,我有一個項目建立在我目前正在試圖解決您的問題。我遇到了同樣的錯誤,你說的,和你在JavaScript中從[]切換到{}時提到的相同的行爲。我會繼續嘗試,並讓我知道如果我找到任何東西。

+0

感謝您的可能解決方案。正如我上面發佈的,我用一個單獨的參數解決了它,但如果我有時間,我會嘗試您的一個建議。 我不禁感到失望,這不是簡單的做到這一點 - 基礎似乎是有,但周圍也有EF + JSON我喜歡太多的瑣碎問題。不過,請讓我知道你是否有進步。 – 2009-11-20 11:42:14