Eksperymentowałem z tworzeniem strony internetowej, która wykorzystuje MVC z JSON dla mojej warstwy prezentacji i frameworku Entity dla modelu danych / bazy danych. Mój problem wchodzi w grę z serializowaniem obiektów Model do JSON.
Korzystam z pierwszej metody kodu, aby utworzyć bazę danych. Podczas wykonywania pierwszej metody kodu relacja jeden do wielu (rodzic / dziecko) wymaga, aby dziecko miało odwołanie do rodzica. (Przykładowy kod może być literówką, ale masz obraz)
class parent
{
public List<child> Children{get;set;}
public int Id{get;set;}
}
class child
{
public int ParentId{get;set;}
[ForeignKey("ParentId")]
public parent MyParent{get;set;}
public string name{get;set;}
}
Podczas zwracania obiektu „nadrzędnego” przez JsonResult generowany jest błąd odwołania cyklicznego, ponieważ „dziecko” ma właściwość nadrzędnej klasy.
Próbowałem atrybutu ScriptIgnore, ale tracę możliwość patrzenia na obiekty potomne. W pewnym momencie będę musiał wyświetlić informacje w widoku nadrzędnego dziecka.
Próbowałem utworzyć klasy podstawowe zarówno dla rodzica, jak i dziecka, które nie mają odwołania cyklicznego. Niestety, kiedy próbuję wysłać baseParent i baseChild, są one odczytywane przez JSON Parser jako ich pochodne klasy (jestem prawie pewien, że ta koncepcja mi ucieka).
Base.baseParent basep = (Base.baseParent)parent;
return Json(basep, JsonRequestBehavior.AllowGet);
Jedynym rozwiązaniem, które wymyśliłem, jest stworzenie modeli „Widok”. Tworzę proste wersje modeli baz danych, które nie zawierają odwołania do klasy nadrzędnej. Każdy z tych modeli widoków ma metodę zwracania wersji bazy danych i konstruktora, który przyjmuje model bazy danych jako parametr (viewmodel.name = databasemodel.name). Ta metoda wydaje się wymuszona, chociaż działa.
UWAGA: Piszę tutaj, ponieważ uważam, że jest to bardziej warte dyskusji. Mógłbym wykorzystać inny wzorzec projektowy, aby rozwiązać ten problem, lub może to być tak proste, jak użycie innego atrybutu w moim modelu. Podczas poszukiwań nie widziałem dobrej metody rozwiązania tego problemu.
Moim celem końcowym byłoby stworzenie ładnej aplikacji MVC, która mocno wykorzystuje JSON do komunikacji z serwerem i wyświetlania danych. Utrzymując spójny model na warstwach (lub najlepiej, jak mogę to wymyślić).
źródło
Prostszą alternatywą dla próby serializacji obiektów byłoby wyłączenie serializacji obiektów nadrzędnych / podrzędnych. Zamiast tego możesz wykonać osobne wywołanie w celu pobrania powiązanych obiektów nadrzędnych / podrzędnych, kiedy i kiedy ich potrzebujesz. To może nie być idealne dla twojej aplikacji, ale jest to opcja.
Aby to zrobić, możesz skonfigurować DataContractSerializer i ustawić właściwość DataContractSerializer.PreserveObjectReferences na „false” w konstruktorze klasy modelu danych. Oznacza to, że odniesienia do obiektów nie powinny być zachowywane przy serializowaniu odpowiedzi HTTP.
Przykłady:
Format Json:
Format XML:
Oznacza to, że jeśli pobierzesz element, do którego odwołują się obiekty potomne, obiekty potomne nie będą serializowane.
Zobacz także klasę DataContractsSerializer .
źródło
Serializator JSON zajmujący się odwołaniami cyklicznymi
Oto przykład niestandardowego Jacksona,
JSONSerializer
który zajmuje się referencjami cyklicznymi, serializując pierwsze wystąpienie i przechowując *reference
do pierwszego wystąpienia we wszystkich kolejnych wystąpieniach.Postępowanie z odniesieniami kołowymi podczas szeregowania obiektów za pomocą Jacksona
Odpowiedni fragment częściowy z powyższego artykułu:
źródło
Jedynym prawidłowym rozwiązaniem jest przesłanie minimum danych. Gdy wysyłasz dane z bazy danych, zwykle nie ma sensu wysyłanie każdej kolumny ze wszystkimi powiązaniami. Konsumenci nie powinni mieć do czynienia z powiązaniami i strukturami baz danych, czyli bazami danych. Pozwoli to nie tylko zaoszczędzić przepustowość, ale także będzie o wiele łatwiejsze w utrzymaniu, czytaniu i zużyciu. Zapytaj o dane, a następnie zamodeluj je pod kątem tego, czego faktycznie potrzebujesz, aby wysłać eq. absolutne minimum.
źródło
.Include(x => x.TableName )
brak zwracania relacji (z tabeli głównej do tabeli zależnej) lub zwracanie tylko jednego wiersza danych, NAPRAW TUTAJ:/programming/43127957/include-not-working-in-net-core-returns-one-parent
Ponadto w Startup.cs upewnij się, że masz to u góry:
źródło