gpt4 book ai didi

entity-framework-core - Entity Framework 7 导航属性为空

转载 作者:行者123 更新时间:2023-12-04 03:09:18 26 4
gpt4 key购买 nike

我正在创建一个 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 为空(这是导航属性),但我确实有 countryid。在 EF 6 中,我有一个用于导航属性的对象。此外,我使用 Moq 进行了单元测试并且它们可以工作(显示 nav 属性)。

我试图添加一个包含,但我不应该需要它。我在 EF 6 或 Mock 中不需要它。

使用 include 给出:
var results = allItems
.Include(i => i.Country)
.GroupBy(g => g.Country)
.ToDictionary(s => s.Key, s => s.Count());

我犯了同样的错误。

这是错误:

Expression of type '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.Func
2[FMS.DAL.Entities.ActionItem,FMS.DAL.Entities.MemberCountry]' of method 'System.Collections.Generic.IEnumerable1[System.Linq.IGrouping2[FMS.DAL.Entities.MemberCountry,FMS.DAL.Entities.ActionItem]] _GroupBy[ActionItem,MemberCountry,ActionItem](System.Collections.Generic.IEnumerable1[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])'

最佳答案

目前 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 执行,但可能不是最佳选择。

关于entity-framework-core - Entity Framework 7 导航属性为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34930680/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com