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
Sfruttare al massimo i topic space di Event Grid MQTT
Utilizzare un service principal per accedere a Azure Container Registry
Effettuare il deploy di immagini solo da container registry approvati in Kubernetes
Copiare automaticamente le secret tra più repository di GitHub
Installare le Web App site extension tramite una pipeline di Azure DevOps
Code scanning e advanced security con Azure DevOps
Eseguire un metodo asincrono dopo il set di una proprietà in Blazor 8
Visualizzare le change sul plan di Terraform tramite le GitHub Actions
Eseguire query manipolando le liste contenute in un oggetto mappato verso una colonna JSON
Usare un KeyedService di default in ASP.NET Core 8
Gestire domini wildcard in Azure Container Apps
Modificare i metadati nell'head dell'HTML di una Blazor Web App