Entity Framework 7のナビゲーションプロパティがnullです

entity-framework-core

質問

Entity Framework 6プロジェクトに代わるEntity Framework 7プロジェクトを作成しています。

私は国に属する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では、デバッガで私はカントリーがヌルであることがわかりましたが(これはナビゲーションプロパティです)、私はカントリードを持っています。 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());

私は同じエラーが発生します。

ここにエラーがあります:

型 '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](システム.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]) '

受け入れられた回答

現在、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で実行することも可能ですが、最適なオプションではない可能性があります。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ