实体类型“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; }
}
这些IEnumerable<SelectListItem>
不应是 EF 模型的一部分。记住单一责任原则。使任何 UI 框架远离 DAL 实现。使用表示School
的视图模型。
至于错误,从EF的角度来看,School
与SelectListItem
有1-n的关联,因此它试图使其成为其映射架构的一部分。但是每个映射类型都需要一个主键,当然不会映射该主键,EF 无法推断任何主键。
一个快速但肮脏的修复方法是从 [NotMapped]
属性映射中排除属性,但更好的代码隔离是真正的补救措施。