Net Core - .Include () genera un loop che causa il crash di Visual Studio

asp.net-core-mvc dbcontext eager-loading entity-framework-core visual-studio-2017

Domanda

Il mio database ha una relazione uno-a-molti tra "UsageRecord" e "Dimension"

Diagramma del database

Questo è modellato come segue (usando un approccio Database-First):

public partial class Dimension
    {               
        ...          
        public virtual ICollection<UsageRecord> UsageRecord { get; set; }       
    }

Classe di utilizzo:

      public partial class UsageRecord
        {
            public long Id { get; set; }
            ...
            public long DimensionId { get; set; }    
            public virtual Dimension Dimension { get; set; }              
        }

Quindi, se chiedo l'elenco di UsageRecords (EagerLoading):

_context.Set<UsageRecord>.Where(x => x.ProductId == productId).ToList()

ottengo una lista di oggetti UsageRecord che posso navigare durante il debug: record di utilizzo

Si noti che l'oggetto Dimension è nullo e questo è corretto poiché non l'ho incluso nella query.

Ora, se provo ad includerlo, l'applicazione si blocca:

_context.Set<UsageRecord>.Where(x => x.ProductId == productId).Include(p => p.Dimension).ToList();

schianto

Postman esce con un errore 502 e VS Debug mostra per prima cosa un elenco di punti interrogativi "?" prima di schiantarsi.

Penso che ciò sia dovuto al fatto che includendo l'oggetto Dimension, questo scorre l'elenco di UsageRecords collegato e quindi la Dimensione ancora e ancora.

Come posso evitarlo?

Risposta popolare

Per recuperare i risultati dalla query LINQ è possibile risolvere il problema in questi modi:

  • Configura il tuo serializzatore per ignorare i loop
  • Crea un modello di visualizzazione per l'azione del tuo controllore
  • Usa il tipo anonimo da Seleziona risultato nell'azione del controllore


Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow