Entity framework core 实体框架7导航属性为空

Entity framework core 实体框架7导航属性为空,entity-framework-core,Entity Framework Core,我正在创建一个EntityFramework7项目来替换EntityFramework6项目 我有一个属于某个国家的项目实体。然后,我有一个linq查询,它按国家获取计数。这是问题所在 var results = allItems .GroupBy(g => g.Country) .ToDictionary(s => s.Key, s => s.Count()); 这适用于EF6,但会引发EF7异常(异常位于底部

我正在创建一个EntityFramework7项目来替换EntityFramework6项目

我有一个属于某个国家的项目实体。然后,我有一个linq查询,它按国家获取计数。这是问题所在

var results = allItems
                .GroupBy(g => g.Country)
                .ToDictionary(s => s.Key, s => s.Count());
这适用于EF6,但会引发EF7异常(异常位于底部)

这是我的实体:

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

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

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

}
在EF7中,通过调试器,我看到国家为空(这是导航属性),但我确实有countryid。在EF 6中,我有一个导航属性的对象。此外,我有使用Moq的单元测试,它们可以工作(显示nav属性)

我试图添加一个include,但我不需要它。我不需要在EF 6或模拟中使用它

使用include可以实现以下功能:

var results = allItems
                    .Include(i => i.Country)
                    .GroupBy(g => g.Country)
                    .ToDictionary(s => s.Key, s => s.Count());
我也犯了同样的错误

以下是错误:

类型表达式 '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]'
不能用于类型为的参数
'System.Func
2[FMS.DAL.Entities.ActionItem,FMS.DAL.Entities.MemberCountry]' 方法论 'System.Collections.Generic.IEnumerable
1[System.Linq.iGroup
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])”


目前,EF7中未实现GroupBy。功能状态可在此处的路线图页面上找到

解决办法是:

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]
context.Countries.选择(x=>new
{
x、 身份证,
Items=x.Items.Count
}).ToDictionary(x=>x.Id,x=>x.Items);
公营国家
{
公共int Id{get;set;}
//添加此属性
公共虚拟ICollection项{get;set;}
}
//生成的SQL
挑选(
选择计数(*)
从[项目]改为[我]
其中[x].[Id]=[i].[Countryid]
),[x].[Id]
来自[国家]作为[x]
这将需要在country中添加Items属性,但允许您在Linq中实现自己的目标。您也可以使用sql编写查询并使用EF执行,但这可能不是最好的选择