【问题标题】:asp.net core (mvc) ViewModel requesting primary keyasp.net core (mvc) ViewModel 请求主键
【发布时间】:2018-12-24 11:14:01
【问题描述】:

在尝试从包含我需要同时更新的 2 个模型的字段的 ViewModel 构建视图时,我不断收到错误消息:

运行所选代码生成器时出错: '实体类型'UserRegViewModel'需要定义一个主键。'

如果我添加主键

[Key]
public int Id { get; set; } 

对于 ViewModel,在 DB 中为 ViewModel 创建了一个包含所有字段的表,我怀疑这是否是 ViewModel 的正确用法。

我的意图是使用 ViewModel 从视图中获取表单,然后在我的控制器中,将 VM 中的每个属性映射到每个域模型。如果我保留声明的主键,我可以成功地手动执行此操作(例如,将 ViewModel 发送到 View,并将 ViewModel 返回到我的 HttpPost 控制器的参数中),但我假设我一定做错了什么就是这样。

我相信我遵守了所有约定(模型、视图、控制器、ViewModels 的独立文件夹)和 ViewModels 文件夹中名为 xxxxViewModel.cs 的 ViewModel。

编辑: 完整的 UserRegViewModel 代码:

using SERVICAPUY.Models.Business;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;


namespace SERVICAPUY.ViewModels
{
    public class UserRegViewModel
    {
        //[Key]
        //public int Id { get; set; }  // must be public!
                                     //public Usuario usuario { get; set; }
                                     //public IEnumerable<Prestamo> Prestamos { get; set; }

        //Usuario
        [Required(ErrorMessage = "El Nombre es obligatorio")]
        public string Nombre { get; set; }
        public string Cedula { get; set; }
        public string Direccion { get; set; }
        public string Direccion2 { get; set; }
        public string Ciudad { get; set; }
        public string Estado { get; set; }
        [Display(Name = "Código Postal")]
        public string CodPostal { get; set; }
        [Display(Name = "País")]
        public string Pais { get; set; }


        public string Telefono { get; set; }
        [DataType(DataType.Date)]
        public DateTime? FechaNacimiento { get; set; }

        //Prestamo
        public Auto auto { get; set; }

        [Required(ErrorMessage = "Cuántas cuotas son?")]
        [Range(1, 120, ErrorMessage = "El número de cuotas debe ser entre 1 y 120.")]
        public int Cuotas { get; set; }
        [Required(ErrorMessage = "Cuál es el monto del préstamo?")]
        public double Monto { get; set; }
        [Required(ErrorMessage = "Cuál es el interés?")]
        [Display(Name = "Interés")]
        public double? Interes { get; set; }
        [Required(ErrorMessage = "Qué día del mes le toca al usuario hacer el pago?")]
        [Display(Name = "Día de Pago")]
        [Range(1, 31, ErrorMessage = "El día de pago corresponde a día del mes.")]
        public int? DiaDePago { get; set; }
        [Display(Name ="Tipo de Prestamo")]
        public tipoPrestamo tipoPrestamo { get; set; }
        public Estatus Estatus { get; set; }
    }
}

【问题讨论】:

  • Viewmodel 不应该是一个实体。请分享您的 UserRegViewModel 的完整 .cs。
  • 我想您正在为视图模型和持久性使用相同的类。 Viewmodels 是 DTO,它应该仅用于此目的。是的,一个 DTO 将有很多与一个或多个持久性模型类通用的字段,但是您可以使用 automapper 例如在两个方向上干净地映射两侧。
  • @ZivWeissman,完全同意!我可以完美地使用 ViewModel,但我要求学习并确保我遵循最佳实践。将编辑 Q 以包含您请求的代码
  • 我对 MVC Core 不太熟悉,但在我看来,您在某处将此类定义为数据上下文类。你能检查一下是否可以做这样的视频:youtube.com/watch?v=T2R8tA80ZuE
  • @ZivWeissman 就是这样!在我的 DbContext 类中找到了引用。我很确定我没有在此处包含此内容,但我发现了问题所在。感谢您帮助解决这个隐藏的问题。

标签: c# asp.net-mvc asp.net-core


【解决方案1】:

@ZivWeissman 找到了答案。它在 cmets 中。 DbContext 类中有对 ViewModel 的引用。也许这会引发另一个问题,因为我很肯定我没有在其中添加参考,但现在问题已经解决了。

【讨论】:

  • 它可能在您当时没有注意到的类型/类重命名期间发生了更改。
  • 我认为这是搭建新视图但不确定时的默认行为。
猜你喜欢
  • 2018-03-03
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
  • 2019-02-12
  • 1970-01-01
  • 1970-01-01
  • 2020-11-15
  • 2023-03-27
相关资源
最近更新 更多