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?
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 incluirMarker
y sus datos relacionados, usamosIncludeFolder
para incluirMarkersTranslations
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ónusing Microsoft.EntityFrameworkCore
para utilizar el métodoIncludeFolder
.