Net Core - .Include () führt zu einer Schleife, die das Debuggen von Visual Studio zum Absturz bringt

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

Frage

Meine Datenbank hat eine Eins-zu-viele-Beziehung zwischen "UsageRecord" und "Dimension"

Datenbankdiagramm

Dies wird wie folgt modelliert (mit einem Database-First-Ansatz):

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

Usage Record-Klasse:

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

Also, wenn ich die Liste von UsageRecords (EagerLoading) abfrage:

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

Ich erhalte eine Liste von UsageRecord-Objekten, durch die ich während des Debugging navigieren kann: Nutzungsdatensatz

Beachten Sie, dass das Dimension-Objekt null ist, und dies ist korrekt, da ich es nicht in die Abfrage aufgenommen habe.

Jetzt, wenn ich versuche, es einzuschließen, stürzt die Anwendung ab:

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

Absturz

Postman wird mit einem 502-Fehler beendet und der VS-Debug zeigt zuerst eine Liste von Fragezeichen "?" bevor sie zusammenbrachen.

Ich denke, das liegt daran, dass durch das Einschließen des Dimensionsobjekts die Liste der angehängten UsageRecords und dann die Dimension immer wieder durchlaufen wird.

Wie kann ich es vermeiden?

Beliebte Antwort

Um Ihr Ergebnis aus der LINQ-Abfrage abzurufen, können Sie Ihr Problem auf folgende Arten lösen:

  • Konfigurieren Sie Ihren Serializer so, dass Schleifen ignoriert werden
  • Erstellen Sie ein Ansichtsmodell für die Aktion Ihres Controllers
  • Verwenden Sie den anonymen Typ von Ergebnis in der Aktion Ihres Controllers auswählen


Related

Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow