I modelli di dominio che utilizziamo con Entity Framework tipicamente presentano relazioni bidirezionali: da un Customer possiamo esplorare la lista dei suoi Order, e dal singolo Order possiamo accedere al Customer a cui appartiene:
public class Customer { public string Name { get; set; } public List<Order> Orders { get; set; } } public class Order { public int Number { get; set; } public Customer Customer { get; set; } }
Un oggetto di questo tipo non è direttamente utilizzabile in un JsonResult a causa della referenza circolare che lo contraddistingue, ossia che la relazione Customer -> Order -> Customer può essere percorsa all'infinito. Una action come la seguente, infatti, solleverà una InvalidOperationException:
public ActionResult JsonDemo() { var c = new Customer() { Name = "Marco" }; var o = new Order { Number = 1, Customer = c }; c.Orders.Add(o); return this.Json(c, JsonRequestBehavior.AllowGet); }
Quando abbiamo accesso diretto agli oggetti di dominio, per esempio perché stiamo utilizzando Entity Framework Code First, questo problema può essere facilmente risolto: ASP.NET MVC, infatti, internamente usa l'oggetto JavaScriptSerializer, che ignora tutte le proprietà marcate con l'attributo ScriptIgnoreAttribute:
public class Order { public int Number { get; set; } [ScriptIgnore] public Customer Customer { get; set; } }
Si tratta di una soluzione adatta però solo a casi particolarmente semplici, perché come detto è applicabile solo quando abbiamo effettivamente la possibilità di modificare il codice della classe di dominio. In generale, invece, utilizzare direttamente le nostre entity per questo scopo non è una best practice. Nel prossimo script presenteremo una soluzione di utilizzo più generale, anche se al costo di una maggiore quantità di codice.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Configurare dependabot per aggiornare le dipendenze di terze parti con GitHub Actions
Accesso sicuro ai secrets attraverso i file in Azure Container Apps
Implementare il throttling in ASP.NET Core
Load test di ASP.NET Core con k6
Effettuare il deploy di immagini solo da container registry approvati in Kubernetes
Utilizzare un service principal per accedere a Azure Container Registry
Specificare il versioning nel path degli URL in ASP.NET Web API
Usare lo spread operator con i collection initializer in C#
Reactive form tipizzati con modellazione del FormBuilder in Angular
Eseguire operazioni sui blob con Azure Storage Actions
Creare un webhook in Azure DevOps
I più letti di oggi
- Utilizzare Docker Compose con Azure App Service
- Utilizzare QuickGrid di Blazor con Entity Framework
- Modernizzare le applicazioni WPF e Windows Forms con Blazor
- ASP 3 per esempi
- annunciato #netstandard 2.1. .NET Core lo supporterà a partire da #netcore3, così come le prossime versione di #xamarin, #mono e #unity.il supporto per #netfx 4.8, invece, non ci sarà. https://aspit.co/bq2