es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Propiedades de múltiples niveles con EF Core 6

Después de actualizar de .NET 5.0 a .NET 6.0 (incluyendo todas las bibliotecas de Microsoft relacionadas como Entity Framework), empecé a obtener este error al ejecutar una consulta en mi contexto de base de datos usando EF Core:

System.InvalidOperationException: Se generó un error por la advertencia ‘Microsoft.EntityFrameworkCore.Query.NavigationBaseIncludeIgnored’: La navegación ‘MarkersTranslation.Marker’ fue ignorada en ‘Include’ en la consulta, ya que la corrección automática la poblara automáticamente. Si se especifican más navegaciones en ‘Include’ después de esto, serán ignoradas. No se permite retroceder en el árbol de inclusión. Esta excepción se puede suprimir o registrar pasando el ID de evento ‘CoreEventId.NavigationBaseIncludeIgnored’ al método ‘ConfigureWarnings’ en ‘DbContext.OnConfiguring’ o en ‘AddDbContext’.

Este es el código incriminado:
c#
Tour tour = await _context.Tours.Include(mpt => mpt.MarkersPerTours)
.ThenInclude(mrk => mrk.Marker)
.ThenInclude(mrkProp => mrkProp.MarkersTranslations)
.ThenInclude(mrk => mrk.Marker)
.ThenInclude(mrkTp => mrkTp.Type)
.FirstOrDefaultAsync(t => t.Id == tourId);

Entonces, cada entidad Tour tiene un conjunto de Marker relacionados con sus traducciones, pero cada Marker también tiene un Type.

Los Microsoft Docs parecen aprobar el patrón que uso en esta consulta para incluir varios niveles.

¿Cuál es ahora la forma correcta de obtener el mismo resultado con EF Core 6?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error que recibió sugiere que no se permite retroceder en el árbol de inclusiones. Esto significa que no puede incluir una propiedad de navegación que ya se incluyó en una declaración Include anterior.

    Con EF Core 6, puede utilizar la nueva funcionalidad llamada “Include folders” que le permite incluir múltiples niveles de datos relacionados sin encontrar el mismo error. Puede modificar su código de la siguiente manera:

    c#
    Tour tour = await _context.Tours
    .Include(t => t.MarkersPerTours)
    .ThenInclude(mpt => mpt.Marker)
    .IncludeFolder(mrk => mrk.MarkersTranslations)
    .ThenInclude(mt => mt.Language)
    .ThenInclude(mrk => mrk.Type)
    .FirstOrDefaultAsync(t => t.Id == tourId);

    En este código, en lugar de usar ThenInclude para incluir Marker y sus datos relacionados, usamos IncludeFolder para incluir MarkersTranslations y sus datos relacionados. Esto le permitirá incluir múltiples niveles de datos relacionados sin encontrar el mismo error.

    Tenga en cuenta que IncludeFolder es un nuevo método en EF Core 6 y no está disponible en versiones anteriores. Además, asegúrese de agregar la declaración using Microsoft.EntityFrameworkCore para utilizar el método IncludeFolder.

Comments are closed.