【问题标题】:Viewmodel has no key definedViewmodel 没有定义键
【发布时间】:2016-03-18 14:56:25
【问题描述】:

我必须以我对视图模型非常陌生。话虽如此,我想创建一个包含付款和订阅信息的视图,例如付款注册页面。我想更新我的 EF 模型中的多个实体,并且我计划通过视图模型来进行。问题是当我尝试根据我的控制器操作创建视图时..我收到此错误:

我的视图模型被用作一个独立的类来获取/发布数据到我的视图中......也许我做错了...... 它必须有一个主键吗?它是否需要在我的数据库中并作为 EF 实体添加?我该如何解决这个问题?谢谢

这是视图模型代码:

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

【问题讨论】:

  • 看起来您试图将此与 EF 相关联。确保它是一个单独的文件夹(比如)ViewModels(不在你的模型文件夹中)。
  • @StephenMuecke,它在一个单独的项目中

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


【解决方案1】:

即使这是一个老问题,我认为这可能会有所帮助: 创建视图时(我怀疑在这种情况下是部分视图),删除 Data Context Class 值。如果已设置,即使您正在创建基于非实体框架的视图,Visual Studio 也会认为您正在使用实体框架,因此会引发该错误。

【讨论】:

    【解决方案2】:

    它必须有一个主键吗?

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

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

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

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

    【讨论】:

    • 我可以试试。视图模型看起来没问题吗?
    • 请查看@Cristian 的回答,因为此错误与在构建未绑定到特定 EF 上下文的视图时选择数据上下文有关。
    • 问题是因为选择了数据上下文类
    • 如果这是一个错误,那么它在 2021 年仍未修复,原帖来自 2015 年。不过来自@mts396 的提示似乎有效
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        使用来自Cristian answer 的提示,我在创建视图时从 UI 中删除了数据上下文类,但它创建的视图没有来自我的实体的字段,这些字段与我的视图模型相结合。因此,我使用具有最多字段的类模型重新创建了视图,然后将 @model 变量更改为我的 viewmodel 类,并更改了每个字段的 FQN。到目前为止,我无法获得更好的解决方案。必须更改每个字段是很痛苦的。

        【讨论】:

          【解决方案6】:

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

          Create
          Delete
          Details
          Edit
          List
          

          在上述任何一种情况下,您需要指定数据上下文类字段的值。所以只需选择Empty (without model) 选项。

          它必须有一个主键吗?

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-03-22
            • 2023-03-09
            • 1970-01-01
            • 2016-04-02
            • 2016-03-16
            • 2013-08-04
            相关资源
            最近更新 更多