【问题标题】:Getting an EntityType has no defined key error when trying to create a view from a MVC ViewModel尝试从 MVC ViewModel 创建视图时获取 EntityType has no defined key 错误
【发布时间】:2016-10-06 16:00:35
【问题描述】:

我正在开发一个 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 中的模型中表示的表的列表组成。而且这些模型类中的每一个确实都有一个为其定义了键的列。

例如,这里是 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; }
}

下面是模型类中定义的其中一个表的部分列表:

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

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

【问题讨论】:

  • 只需确保您的视图模型位于单独的文件夹中(例如ViewModels),这样就不会与 EF 关联。
  • 它们在一个单独的文件夹中。
  • 然后你做的其他事情导致它被添加到你的数据库上下文中

标签: asp.net-mvc asp.net-mvc-viewmodel


【解决方案1】:

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

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

  1. 输入您的视图名称
  2. 选择您的模板(如果您将其保留为“空(无模型)”,那么您应该能够直接创建它而不会出现任何问题)。
  3. 选择特定模板和模型类 (ViewModel) 后,“数据上下文类”将自动填充您的连接字符串 (dbcontext),这就是您的问题所在。

由于视图模型不应该与数据访问层相关联,您只需删除“数据上下文类”中自动填充的内容,然后您应该能够创建视图。

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

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

希望这会有所帮助!

【讨论】:

  • 我不知道。当我选择 ViewModel 作为模型类时,数据上下文类由 DbContext 派生类填充。我以为它应该是这样的。在没有 DbContext 派生类的情况下尝试一下。
  • 我认为这就是答案。我现在只是在努力解决路由问题。
  • @Rod 路由有什么问题?
猜你喜欢
  • 1970-01-01
  • 2021-09-06
  • 1970-01-01
  • 1970-01-01
  • 2013-05-03
  • 1970-01-01
  • 2017-08-24
  • 2020-03-31
  • 1970-01-01
相关资源
最近更新 更多