尝试从 MVC ViewModel 创建视图时获取 EntityType 没有定义的键错误

Getting an EntityType has no defined key error when trying to create a view from a MVC ViewModel

我正在开发一个 ASP.NET MVC 5 项目,在该项目中我试图从 MVC 视图模型构建控制器。该 ViewModel 汇集了我需要在视图中显示的 6 个表。据我了解,使用 MVC ViewModels 是在视图中显示多个表的一种方式。无论如何,我收到以下错误消息:

Error

There was an error running the selected code generator: 'Unable to retrieve metadata for
 'PrismSmallTasks.ViewModels.ManageInterviewVM'. One of more validation errors were
 detected during model generation:

ManageInterviewVM:: EntityType 'ManageInterviewVM' has no key defined.
Define the key for this EntityType.
ManageInterviewVMs: EntityType: EntitySet 'ManageInterviewsVMs' is based on
type 'ManageInterviewVM' that has no keys defined.

ManageInterviewVM ViewModel 中没有密钥。这是因为它由 VM 中的模型中表示的表列表组成。每个模型 classes do 都有一个为其定义了键的列。

例如,这里是 ManageInterviewVM:

public class ManageInterviewVM
{
    public List<FieldRecord> FieldRecords { get; set; }
    public List<TaskList> TaskLists { get; set; }
    public List<InterviewARVTreatment> InterviewARVTreatments { get; set; }
    public List<Note> Notes { get; set; }
    public List<Risk> Risks { get; set; }
    public List<Interview1> Interviews { get; set; }
}

这里是模型中定义的其中一个表的部分列表 class:

public partial class TaskList
{
    [Key]
    public int ID_TaskList { get; set; }
    [Required]
    [StringLength(15)]
    public string CD_TaskListType { get; set; }
    public int? ID_Profile { get; set; }
    public int? ID_FieldRecord { get; set; }
    public int? ID_Interview { get; set; }

所以,我不知道我错过了什么。为什么会出现此错误以及如何解决它?

您的 ViewModel 应该与您的数据上下文(数据访问层)完全分离。只有您的领域模型应该处理 DAL。 ViewModel 仅用于向视图显示特定信息。

所以在您创建 ViewModel 之后..您尝试创建您的视图。当您到达此屏幕时:

  1. 输入您的视图名称
  2. 选择您的模板(如果您将其保留为 'Empty (without model)',那么您应该能够毫无问题地创建它)。
  3. 一旦您选择了特定的模板和模型 class (ViewModel),'Data context class' 将自动填充您的连接字符串 (dbcontext),这就是您的问题所在。

由于视图模型不应该与数据访问层相关联,您只需删除 'Data context class' 中自动填充的内容,然后您应该能够创建视图。

如果您陷入认为需要为您的视图模型定义键的陷阱..那么您的视图模型 class 将被添加到您的连接字符串的 class (dbcontext class).. 这是一个禁忌。

您需要使用域模型查询数据库。然后将这些值分配给要显示的 ViewModel 属性。

希望对您有所帮助!