La propiedad de navegación Entity Framework 7 es nula

entity-framework-core

Pregunta

Estoy creando un proyecto de Entity Framework 7 para reemplazar un proyecto de Entity Framework 6.

Tengo una entidad de artículo que pertenece a un país. Entonces tengo una consulta de linq que obtiene el recuento por país. Aquí está la consulta.

var results = allItems
                .GroupBy(g => g.Country)
                .ToDictionary(s => s.Key, s => s.Count());

Esto funciona con EF6 pero lanza una excepción con EF 7 (la excepción está en la parte inferior).

Esta es mi entidad:

var results = allItems
                .GroupBy(g => g.Country)
                .ToDictionary(s => s.Key, s => s.Count());

En EF 7, con el depurador veo que el País es nulo (esa es la propiedad de navegación) pero tengo el ID de país. En EF 6, tengo un objeto para la propiedad de navegación. Además, tengo pruebas de unidad con Moq y funcionan (muestran la propiedad de navegación).

Intenté agregar una inclusión, pero no debería necesitar eso. No lo necesité en EF 6 ni con el Mock.

Usando include da esto:

var results = allItems
                .GroupBy(g => g.Country)
                .ToDictionary(s => s.Key, s => s.Count());

Me sale el mismo error.

Aquí está el error:

Expresión de tipo 'System.Func 2[Microsoft.Data.Entity.Query.EntityQueryModelVisitor+TransparentIdentifier 2 [Microsoft.Data.Entity.Query.EntityQueryModelVisitor + TransparentIdentifier 2[FMS.DAL.Entities.ActionItem,Microsoft.Data.Entity.Storage.ValueBuffer],Microsoft.Data.Entity.Storage.ValueBuffer],FMS.DAL.Entities.MemberCountry]' cannot be used for parameter of type 'System.Func 2 [FMS.DAL.Entities.ActionItem, FMS.DAL.Entities .MemberCountry] 'del método' System.Collections.Generic.IEnumerable 1[System.Linq.IGrouping 2 [FMS.DAL.Entities.MemberCountry, FMS.DAL.Entities.ActionItem]] _GroupBy [ActionItem, MemberCountry, ActionItem) Sistema .Collections.Generic.IEnumerable 1[FMS.DAL.Entities.ActionItem], System.Func 2 [FMS.DAL.Entities.ActionItem, FMS.DAL.Entities.MemberCountry], System.Func`2 [FMS.DAL.Entities .ActionItem, FMS.DAL.Entities.ActionItem]) '

Respuesta aceptada

Actualmente, GroupBy no está implementado en EF7; el estado de las funciones se puede encontrar en la página de la hoja de ruta aquí. https://github.com/aspnet/EntityFramework/wiki/Roadmap

Un trabajo alrededor sería:

context.Countries.Select( x => new
{
    x.Id,
    Items = x.Items.Count
} ).ToDictionary( x => x.Id, x => x.Items );

public class Country
{
    public int Id { get; set; }

    //Add this property
    public virtual ICollection<Item> Items { get; set; }
}

//Generated SQL
SELECT (
    SELECT COUNT(*)
    FROM [Item] AS [i]
    WHERE [x].[Id] = [i].[Countryid]
), [x].[Id]
FROM [Country] AS [x]

Esto requeriría agregar una propiedad de Artículos al país, pero le permitiría lograr lo que es después de todo en Linq. También puede escribir la consulta en SQL y ejecutarla con EF, pero puede que no sea la mejor opción.




Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué