Entity Framework 7導航屬性為null

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中引發異常(例外情況在底部)。

這是我的實體:

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

在EF 7中,使用調試器,我看到Country是null(這是導航屬性),但我確實有countryid。在EF 6中,我有一個導航屬性的對象。另外,我使用Moq進行單元測試並且它們可以工作(顯示nav屬性)。

我試圖添加一個包含但我不應該這樣做。我不需要在EF 6或Mock中使用它。

使用include給出:

var results = allItems
                .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 [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 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 [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](系統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])'

一般承認的答案

目前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屬性添加到country,但是可以讓你在Linq中實現你的目標。您也可以在sql中編寫查詢並使用EF執行,但可能不是最佳選擇。




許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因