【问题标题】:The entity type 'Microsoft.AspNet.Mvc.Rendering.SelectListGroup' requires a key to be defined实体类型“Microsoft.AspNet.Mvc.Rendering.SelectListGroup”需要定义一个键
【发布时间】:2016-04-24 01:38:44
【问题描述】:

不确定发生了什么,但我在尝试在我的网络应用程序中调出任何视图时遇到以下错误。该代码是由 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());
}

经过一番搜索,我无法确切地知道我需要修复什么。这曾一度奏效。不知道发生了什么变化。

视图确实有定义

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

【问题讨论】:

  • 大胆猜测,但您的某个实体可能没有定义 PK?
  • Define @model 首先在你的视图中输入。
  • 我补充说我确实在视图中定义了模型,并且每个数据库表都有一个 id 字段。
  • 只是为了麻烦,请尝试删除您的Includes(),看看会发生什么。
  • 删除包含仍然会在返回语句而不是定义语句上引发相同的错误

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


【解决方案1】:

这些IEnumerable&lt;SelectListItem&gt;s 应该成为您的 EF 模型的一部分。记住单一责任原则。让任何 UI 框架远离您的 DAL 实现。使用表示School 的视图模型。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    • 2021-11-27
    相关资源
    最近更新 更多