エンティティタイプ 'Microsoft.AspNet.Mvc.Rendering.SelectListGroup'には、キーを定義する必要があります

asp.net-core-mvc asp.net-mvc c# entity-framework entity-framework-core

質問

何が起こったのか分かりませんが、私のWebアプリケーションで任意のビューをプルしようとすると、次のエラーが表示されます。コードはVisual Studioによって自動的に生成され、ビルド前にエラーは発生していません。 ASP.Net MVC 6、EF7を使用します。

EntityFramework.Core.dllで 'System.InvalidOperationException'型の例外が発生しましたが、ユーザーコードで処理されませんでした

追加情報:エンティティタイプ 'Microsoft.AspNet.Mvc.Rendering.SelectListGroup'には、キーを定義する必要があります。

コードがエラーになっている行は次のとおりです。

public IActionResult Index()
{
    var schoolContext = _context.Schools
                                .Include(s => s.District)
                                .Include(s => s.Location)
                                .Include(s => s.Tier);
    return View(schoolContext.ToList());
}

いくつかの検索の後、私は何を修正する必要があるかを正確に把握することはできません。これは一点で作業していました。何が変わったのか分かりません。

ビューはdefenitionを持っています

@model IEnumerable<School>

ここで要求されているように、学校モデルです

public class School
{
    //Original Fields
    public int SchoolId { get; set; }

    [Display(Name = "Name")]
    public string SchoolName { get; set; }

    [Display(Name = "Date Added")]
    public DateTime SchoolDateAdded { get; set; }

    [Display(Name = "Last Update")]
    public DateTime SchoolLastUpdate { get; set; }

    [Display(Name="Updated By")]
    public string SchoolUpdatedBy { get; set; }

    //Referance Fields
    public int DistrictId { get; set; }
    public IEnumerable<SelectListItem> DistrictList { get; set; }
    public int LocationId { get; set; }
    public IEnumerable<SelectListItem> LocationList { get; set; }
    public int TierId { get; set; }
    public IEnumerable<SelectListItem> TierList { get; set; }

    //Navigation Property
    public District District { get; set; }
    public Location Location { get; set; }
    public Tier Tier { get; set; }
}

受け入れられた回答

これらのIEnumerable<SelectListItem>は、EFモデルの一部であってなりませ責任の原則を覚えておいてください。どんなUIフレームワークもDAL実装から離れてください。 School表すビューモデルを使用します。

エラーについては、EFの観点から見ると、 SchoolSelectListItemと1-nの関係を持っているため、マッピングスキーマの一部にしようとします。しかし、それぞれのマップされた型はプライマリキーを必要とします。プライマリキーはもちろんマップされていません。そして、EFは何も推論できません。

速くて汚いのは、プロパティを[NotMapped]属性でマッピングされないようにすることですが、コードをよりよく分離することが本当の救済策です。



Related

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