2011-11-02 79 views
5

將EF實體轉換爲json對象時,我在循環引用方面遇到了一些問題。我發現我工作的解決方案,但我想知道,當IM添加分散EF實體;禁用代理創建和延遲加載?

context.ContextOptions.ProxyCreationEnabled = false; 

和/或

context.ContextOptions.LazyLoadingEnabled = false; 

第一個似乎是夠得着什麼是真正發生的事情單維json對象。我應該同時使用嗎?他們實際上做了什麼?有更聰明的方法嗎?謝謝

+0

我注意到你的上一篇文章,你正在使用JavaScriptSerializer ..有一個特定的原因呢?這是一個Web應用程序?我認爲你應該採取不同的方法來獲取你的json,比如DataContractJsonSerializer或者Json.NET庫。 –

+0

@SeanThoman我試過使用json.net,但仍然得到了循環引用異常。這是一個普通的asp.net 4.0網頁表單應用程序。你有沒有使用DataContractJsonSerializer的例子? – Johan

回答

6

第一行關閉了繼承自實體類的類的運行時生成。這個類在運行時真正使用。不是你的班級。這個運行時生成的類可能不是Serializable,這就是爲什麼這一行(關閉代理生成)使序列化工作。

第二行關閉延遲加載。假設你有Parent實體和Child實體。當您請求「家長」時,如果延遲加載處於打開狀態,則不會加載「孩子」。當它加載的時候關閉,你加載它的所有孩子。我認爲這是你應該熟悉的東西,如果你正在使用EF。

編輯: 如果循環引用有問題,那麼你應該關閉延遲加載。然後,當你序列化父母,你不會嘗試序列化有參考父母的孩子(創建循環引用)

+0

好的,但應該禁用懶加載單獨做伎倆呢? – Johan

+0

就像你說的。第一條線就夠了。 –

+0

是的,我只是不明白爲什麼禁用延遲加載就夠了。不應該刪除與其他實體的關係? – Johan