实体框架7导航属性为空

时间:2016-01-21 17:42:03

标签: entity-framework-core

我正在创建一个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进行单元测试并且它们可以工作(显示nav属性)。

我尝试添加一个包含但我不应该这样做。我不需要在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]' cannot be used for parameter of type 'System.Func 2 [FMS.DAL.Entities.ActionItem,FMS.DAL.Entities.MemberCountry]'   方法   “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])'

1 个答案:

答案 0 :(得分:1)

目前在EF7中未实现GroupBy,可在路线图页面上找到功能状态。 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执行,但可能不是最佳选择。