实体类型“Microsoft.AspNet.Mvc.Rendering.SelectListGroup”需要定义键

本文关键字:定义 SelectListGroup Rendering 类型 Microsoft AspNet Mvc 实体 | 更新日期: 2023-09-27 18:30:56

不确定发生了什么,但是在尝试在我的Web应用程序中拉出任何视图时,我收到以下错误。代码是由视觉工作室自动生成的,我在构建之前没有收到任何错误。使用 ASP.Net MVC 6、EF7。

EntityFramework.Core 中发生类型为"System.InvalidOperationException"的异常.dll但未在用户代码中处理

其他信息:实体类型"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());
}

经过一些搜索,我无法确切地弄清楚我需要修复什么。这在某一时刻起作用。不知道发生了什么变化。

该视图确实具有定义

@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; }
}

实体类型“Microsoft.AspNet.Mvc.Rendering.SelectListGroup”需要定义键

这些IEnumerable<SelectListItem>不应是 EF 模型的一部分。记住单一责任原则。使任何 UI 框架远离 DAL 实现。使用表示School的视图模型。

至于错误,从EF的角度来看,SchoolSelectListItem有1-n的关联,因此它试图使其成为其映射架构的一部分。但是每个映射类型都需要一个主键,当然不会映射该主键,EF 无法推断任何主键。

一个快速但肮脏的修复方法是从 [NotMapped] 属性映射中排除属性,但更好的代码隔离是真正的补救措施。