Viewmodel没有定义键

时间:2015-12-12 20:48:29

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

我必须在此前言,我对视图模型很新。话虽这么说,我希望有一个带付款和订阅信息的创建视图,比如付款注册页面。我想在我的EF模型中更新多个实体,并且我计划通过viewmodel进行更新。问题是当我尝试根据我的控制器动作创建视图时..我收到此错误: enter image description here

我的viewmodel用于一个独立的类来获取/发布数据到我的视图...也许我正在以错误的方式进行此操作.. 它是否必须有一个主键?它是否需要在我的数据库中并作为EF实体添加?我该如何解决这个问题?感谢

这是viewmodel代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MVCProject.DataAccess;
using System.ComponentModel.DataAnnotations;

namespace MVCProject.Models.ViewModel
{
    public class PaymentSetupViewModel
    {
        //Subscription.cs
        [Required(ErrorMessage = "required")]
            public string Frequency { get; set; }
            public DateTime Date { get; set; }

        //PaymentMethod.cs    
        [Required(ErrorMessage = "required")]
            [CreditCard]
            [Display(Name = "Card Number")]
            public string CCNumber { get; set; }

            [Required(ErrorMessage = "required")]
            [Display(Name = "Card Expiration")]
            public DateTime CCExpiration { get; set; }

            [Required(ErrorMessage = "required")]
            [Display(Name = "CVV2")]
            public string CCCVV2 { get; set; }

            [Required(ErrorMessage = "required")]
            [Display(Name = "Bank Name")]
            public string BankName { get; set; }

            [Required(ErrorMessage = "required")]
            [Display(Name = "Account Number")]
            public string BankAccountNumber { get; set; }

            [Required(ErrorMessage = "required")]
            [Display(Name = "Routing Number")]
            public string BankRoutingNumber { get; set; }

            [Required(ErrorMessage = "required")]
            public string ProductName { get; set; }

        //AspNetUser.cs properties -- identity list of logins
        public string UserName { get; set; }

        //PaymentSubscriptionViewModels.cs properties    
        public int SelectedValue { get; set; }
    }
}

6 个答案:

答案 0 :(得分:11)

即使这是一个陈旧的回答问题,我认为这可能会有所帮助: 创建视图时(我怀疑在这种情况下是局部视图),删除数据上下文类值。如果已设置,即使您正在创建基于非实体框架的视图,Visual Studio也会认为您正在使用实体框架,因此它会抛出该错误。

答案 1 :(得分:4)

  

是否必须有主键?

没有。 View模型是一个简单的POCO类。除非您想在UI / Validation / Business层中进行一些自定义验证,否则不需要使用[Key]属性修饰任何属性。

  

是否需要在我的数据库中并添加为EF实体?

没有。查看模型的目的是在视图和操作方法之间传递数据。您将从一个视图模型对象中读取数据,并根据需要将其保存在2个或更多表中。视图模型应该是精简和平坦的,因为它是针对特定视图的。

您看到的错误可能是Visual Studio中的错误。为什么不手动创建操作方法,视图(d 不在向导中选择模型)并更新视图以将视图模型用作model

答案 2 :(得分:1)

(如果首先使用代码,或者步骤到第二步)首先,您必须检查ViewModel使用的模型(实体)(并且您使用直接连接到数据库),其中属性(列)已设置“[Key] ]“数据注释。

其次,您必须在ViewModel类中包含主键属性(列),并在ViewModel类中为其指定“[Key]”Data Annotation。 (因为你必须为计算机分配一个键来区分每一行。)

第三,重建整个项目,然后就可以成功使用内置模板生成View。

答案 3 :(得分:1)

在为操作方法创建相应的视图时,请确保将数据上下文类留空。只需擦除它的默认值,您将摆脱此错误。

答案 4 :(得分:0)

使用来自Cristian answer的技巧,在创建视图时,我从UI中删除了数据上下文类,但是它创建了一个视图,但没有来自实体的字段构成了我的视图模型。因此,我使用具有最多字段的类模型重新创建了视图,然后将@model变量更改为我的viewmodel类,并更改了每个字段的FQN。到目前为止,我还没有更好的解决方案。必须更改每个字段都是很痛苦的事情。

答案 5 :(得分:0)

通过选择“模板”字段的Empty (without model)值而不是以下任何一项来创建空视图:

Create
Delete
Details
Edit
List

如果进行上述任何选择,则需要指定“数据上下文类”字段的值。因此,只需使用Empty (without model)选项。

  

它必须具有主键吗?

不一定。这取决于您的要求。