C# Viewmodel没有定义键

C# Viewmodel没有定义键,c#,asp.net-mvc,entity-framework,viewmodel,C#,Asp.net Mvc,Entity Framework,Viewmodel,我必须先说一句,我对viewmodels非常陌生。这就是说,我想有一个付款和订阅信息的创建视图,像一个付款注册页面。我想更新我的EF模型中的多个实体,我正计划通过viewmodel进行更新。问题是当我尝试基于控制器操作创建视图时。。我得到这个错误: My viewmodel是一个独立类,用于获取/发布数据到My view。。。也许我走错了方向它必须有主键吗?它是否需要在我的数据库中并作为EF实体添加?如何解决此问题?谢谢 以下是viewmodel代码: using System; using

我必须先说一句,我对viewmodels非常陌生。这就是说,我想有一个付款和订阅信息的创建视图,像一个付款注册页面。我想更新我的EF模型中的多个实体,我正计划通过viewmodel进行更新。问题是当我尝试基于控制器操作创建视图时。。我得到这个错误:

My viewmodel是一个独立类,用于获取/发布数据到My view。。。也许我走错了方向它必须有主键吗?它是否需要在我的数据库中并作为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; }
    }
}
它必须有主键吗

不是。视图模型是一个简单的POCO类。除非您想在UI/验证/业务层中执行一些自定义验证,否则不需要使用[Key]属性装饰任何属性

它是否需要在my db中并作为EF实体添加

不是。视图模型的目的是在视图和动作方法之间传递数据。您将从一个视图模型对象中读取数据,并根据需要将其保存在两个或多个表中。视图模型应该是倾斜和平坦的,因为它是用于特定视图的

您看到的错误可能是visual studio中的错误。为什么不手动创建一个操作方法、一个视图(不要在向导中选择模型)并更新视图以使用视图模型作为
模型
(如果使用代码第一步或步骤到第二步)首先,您必须检查ViewModel(用于直接连接到数据库)使用的模型(实体)的哪个属性(列)已设置“[Key]”数据批注

其次,必须在ViewModel类中包含主键属性(列),并在ViewModel类中为其提供“[key]”数据注释。 (因为您必须为计算机分配一个键来区分每一行。)


第三,重建整个项目,然后您可以成功地使用内置模板生成视图。

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

在创建视图时,我使用的提示从UI中删除了数据上下文类,但它创建的视图中没有实体中的字段,这些字段构成了我的viewmodel。因此,我使用字段最多的类模型重新创建了视图,然后将@model变量更改为我的viewmodel类,并更改了每个字段的FQN。直到现在,我还没有找到更好的解决办法。必须更改每个字段是一件痛苦的事情。

为操作方法创建相应的视图时,请确保将数据上下文类留空。只需删除它的默认值,就可以消除此错误

通过选择模板字段的
empty(无模型)
值而不是以下任何一项来创建空视图:

Create
Delete
Details
Edit
List
在上述任何选择的情况下,您需要指定数据上下文类字段的值。所以只需使用
Empty(不带型号)
选项即可

它必须有主键吗


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

我可以试试。viewmodel看起来正常吗?请看@Cristian的答案,因为此错误与在构建未绑定到特定EF上下文的视图时选择数据上下文有关。问题是因为选择了数据上下文类。如果这是一个错误,那么它在2021年仍然未修复,原始帖子是从2015年开始的。@mts396的提示似乎有效,但你似乎试图将其与EF联系起来。确保它是一个单独的文件夹(比如说)ViewModels(不在你的models文件夹中)。@StephenMuecke,它在一个单独的项目中