Net Core: .Include () produce un bucle que hace que la depuración de Visual Studio se bloquee

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

Pregunta

Mi base de datos tiene una relación de uno a varios entre "UsageRecord" y "Dimension"

Diagrama de base de datos

Esto se modela de la siguiente manera (utilizando un enfoque de Base de Datos Primero):

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

Clase de registro de uso:

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

Entonces, si pregunto en la lista de UsageRecords (EagerLoading):

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

Obtengo una lista de objetos UsageRecord por los que puedo navegar durante la depuración: registro de uso

Tenga en cuenta que el objeto Dimension es nulo, y esto es correcto ya que no lo he incluido en la consulta.

Ahora, si trato de incluirlo, la aplicación falla:

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

choque

Postman sale con un error 502, y VS Debug primero muestra una lista de signos de interrogación "?" antes de estrellarse

Creo que esto se debe al hecho de que al incluir el objeto Dimension, esto recorre la lista de UsageRecords adjunta y luego la Dimensión una y otra vez.

¿Cómo puedo evitarlo?

Respuesta popular

Para recuperar su resultado de la consulta LINQ, puede resolver su problema de la siguiente manera:

  • Configure su serializador para ignorar los bucles
  • Crea un modelo de vista para la acción de tu controlador.
  • Use el tipo anónimo de Seleccione el resultado en la acción de su controlador


Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow