实体类型' Microsoft.AspNet.Mvc.Rendering.SelectListGroup'需要定义一个键

时间:2016-01-18 19:10:21

标签: c# asp.net-mvc entity-framework asp.net-core-mvc entity-framework-core

不确定发生了什么,但在尝试提取我的网络应用中的任何视图时出现以下错误。代码由visual studio自动生成,我在构建之前没有收到任何错误。使用ASP.Net MVC 6,EF7。

  

类型' System.InvalidOperationException'的例外情况发生在EntityFramework.Core.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; }
}

1 个答案:

答案 0 :(得分:9)

这些# prevents files starting with dot to be viewed by browser RewriteRule /\.|^\. - [F] 应该成为您的EF模型的一部分。记住单一责任原则。使任何UI框架远离DAL实现。使用表示IEnumerable<SelectListItem>的视图模型。

就错误而言,从EF的角度来看,SchoolSchool有1-n关联,因此它会尝试将其作为其映射架构的一部分。但是每个映射类型都需要一个主键,当然不会映射,而EF不能推断出任何主键。

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