Свойство навигации Entity Framework 7 имеет значение null

Я создаю проект Entity Framework 7 для замены проекта Entity Framework 6.

У меня есть объект Item, принадлежащий стране. Затем у меня есть запрос linq, который подсчитывает количество по странам. Вот запрос.

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

Это работает с EF6, но вызывает исключение с EF 7 (исключение находится внизу).

Это моя сущность:

public class Item
{
    [Key]
    public int id { get; set; }

    [Required]
    public int Countryid { get; set; }

    [ForeignKey("Countryid")]
    public virtual Country Country { get; set; }

}

В EF 7 с помощью отладчика я вижу, что Country имеет значение null (это свойство навигации), но у меня есть countryid. В EF 6 у меня есть объект для свойства навигации. Кроме того, у меня есть модульные тесты с использованием Moq, и они работают (свойство show the nav).

Я попытался добавить включение, но мне это не нужно. Мне это не понадобилось ни в EF 6, ни в Mock.

Использование include дает следующее:

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

Я получаю ту же ошибку.

Вот ошибка:

Выражение типа 'System.Func2[Microsoft.Data.Entity.Query.EntityQueryModelVisitor+TransparentIdentifier2 [Microsoft.Data.Entity.Query.EntityQueryModelVisitor + TransparentIdentifier2[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.Func2 [FMS.DAL.Entities.ActionItem, FMS.DAL.Entities.MemberCountry] »метода' System.Collections.Genrable_6. DAL.Entities.MemberCountry, FMS.DAL.Entities.ActionItem]] _GroupBy [ActionItem, MemberCountry, ActionItem] (System.Collections.Generic.IEnumerable1[FMS.DAL.Entities.ActionItem], System.Func2 [FMS.DAL.Entities.ActionItem, FMS.DAL.Entities.MemberC .Func`2 [FMS.DAL.Entities.ActionItem, FMS.DAL.Entities.ActionItem]) '


person Don Chambers    schedule 21.01.2016    source источник


Ответы (1)


В настоящее время GroupBy не реализован в EF7, статус функций можно найти на странице дорожной карты здесь. https://github.com/aspnet/EntityFramework/wiki/Roadmap

Работа будет:

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]

Это потребует добавления свойства Items в страну, но позволит вам добиться того, чем вы являетесь в конце концов, в Linq. Вы также можете написать запрос в sql и выполнить его с помощью EF, но это может быть не лучшим вариантом.

person Jake Rote    schedule 21.01.2016