La proprietà di navigazione di Entity Framework 7 è null

entity-framework-core

Domanda

Sto creando un progetto Entity Framework 7 per sostituire un progetto Entity Framework 6.

Ho un'entità Item che appartiene a un paese. Ho quindi una query linq che ottiene il conteggio per paese. Ecco la query.

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

Funziona con EF6 ma genera un'eccezione con EF 7 (l'eccezione è in basso).

Questa è la mia entità:

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

In EF 7, con il debugger vedo che il Paese è nullo (questa è la proprietà di navigazione) ma ho il countryid. In EF 6, ho un oggetto per la proprietà di navigazione. Inoltre, ho dei test unitari usando Moq e funzionano (mostra la proprietà nav).

Ho provato ad aggiungere un inclusivo ma non avrei dovuto averne bisogno. Non ne avevo bisogno in EF 6 o con il Mock.

Usare include dà questo:

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

Ho fatto lo stesso errore.

Ecco l'errore:

Espressione di 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] 'di metodo' System.Collections.Generic.IEnumerable 1[System.Linq.IGrouping 2 [FMS.DAL.Entities.MemberCountry, FMS.DAL.Entities.ActionItem]] _GroupBy [ActionItem, MemberCountry, ActionItem] (System .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])'

Risposta accettata

Attualmente GroupBy non è implementato in EF7 lo stato delle funzionalità può essere trovato sulla pagina della mappa stradale qui. https://github.com/aspnet/EntityFramework/wiki/Roadmap

Un lavoro in giro sarebbe:

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]

Ciò richiederebbe l'aggiunta di una proprietà Items al paese, ma ti permetterebbe di ottenere ciò che sei dopo tutto in Linq. Si potrebbe anche andare a scrivere la query in sql ed eseguire con EF ma potrebbe non essere l'opzione migliore.




Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché