2011-11-02 11 views
5

Występują problemy z odwołaniami cyklicznymi podczas przekształcania elementów EF w obiekty json. Znalazłem rozwiązanie, które działa dla mnie, ale chciałbym wiedzieć, co się rzeczywiście dzieje, gdy im dodającserwowanie elementów EF; wyłączanie tworzenia proxy i luźnego ładowania?

context.ContextOptions.ProxyCreationEnabled = false; 

i/lub

context.ContextOptions.LazyLoadingEnabled = false; 

Pierwszy z nich wydaje się być wystarczający, aby uzyskać jednowymiarowy obiekt json. Czy powinienem używać obu? I co oni właściwie robią? Czy jest to mądrzejszy sposób? Dzięki

+0

Zauważyłem z twojego ostatniego posta, że ​​używasz JavaScriptSerializer ... jest jakiś konkretny powód? Czy jest to aplikacja internetowa? Myślę, że powinieneś przyjąć inne podejście do uzyskania swojego jsona, takie jak DataContractJsonSerializer lub biblioteka Json.NET. –

+0

@SeanThoman Próbowałem używać json.net, ale nadal mam wyjątek odwołania cyklicznego. Jest to normalna aplikacja internetowa asp.net 4.0. Czy masz jakieś przykłady przy użyciu DataContractJsonSerializer? – Johan

Odpowiedz

6

Pierwszy wiersz wyłącza generowanie klasy wykonawczej klasy, która dziedziczy z klasy encji. Ta klasa jest naprawdę używana podczas uruchamiania. Nie twoja klasa. Ta klasa wygenerowana przez środowisko uruchomieniowe prawdopodobnie nie jest Serializowalna i dlatego ta linia (wyłączająca generowanie proxy) powoduje pracę z serializacją.

Druga linia wyłącza leniwy załadunek. Załóżmy, że masz jednostkę nadrzędną i element podrzędny. Kiedy pytasz o Parent, nie ładujesz dzieci, gdy jest włączone leniwy załadunek. Kiedy jest wyłączony po załadowaniu Parent, ładuje wszystkie swoje dzieci. Myślę, że jest to coś, o czym powinieneś się zapoznać, jeśli używasz EF.

Edycja: Jeśli występuje problem z okrągłym odnośnikiem, należy wyłączyć leniwy załadunek. Następnie, gdy serializujesz Parent, nie będziesz próbować serializować dzieci, które mają odniesienie do Parent (tworzenie odwołań cyklicznych).

+0

OK, ale czy wyłączyć leniwy załadunek samemu? – Johan

+0

Tak jak powiedziałeś. Wystarczy pierwsza linia. –

+0

Tak, po prostu nie rozumiem, dlaczego wyłączenie leniwego ładowania jest wystarczające. Czy nie powinno to usuwać relacji z innymi podmiotami? – Johan

Powiązane problemy