使用 MVVM 在基础中注册新客户端时出错

Posted

技术标签:

【中文标题】使用 MVVM 在基础中注册新客户端时出错【英文标题】:Error when registering a new client in the base using MVVM 【发布时间】:2021-10-07 22:53:26 【问题描述】:

大家早上好,我正在接受这个“InvalidOperationException:尝试保存更改时'Customer.CustomerId'的值是未知的。 " 在我的应用程序中,当我尝试将客户端保存在基础中以接收其 ID 以传递 ViewModel 的第二项时。 我正在使用 Asp.Net Core 5

public class Cliente

    [Display(Name = "Código")]
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ClienteId  get; set; 

    [Display(Name = "Nome")]
    [StringLength(50)]
    public string Nome  get; set; 
   
    [Display(Name = "Fantasia")]
    [StringLength(40)]
    public string Fantasia  get; set; 

    [Display(Name = "Inscrição Estadual")]
    public string IE  get; set; 

    [Display(Name = "CPF ou CNPJ")]
    public string Cpf_Cnpj  get; set; 

    [Display(Name = "Tipo Pessoa")]
    public string Tipo_Pessoa  get; set; 

    [Required(ErrorMessage = "Informe o seu endereço")]
    [StringLength(100)]
    [Display(Name = "Endereço")]
    public string Endereco  get; set; 

    [Display(Name = "Numero")]
    public string Numero  get; set; 

    [Display(Name =  "Informe o seu Complemento")]
    public string Complemento  get; set; 

    [StringLength(50)]
    public string Bairro  get; set; 

    [Required(ErrorMessage = "Informe o seu CEP")]
    [Display(Name = "CEP")]
    [StringLength(10, MinimumLength = 8)] 
    public string Cep  get; set; 

    [StringLength(30)]
    [Display(Name = "Cidade")]
    public string Cidade  get; set; 

    [StringLength(30)]
    [Display(Name = "Estado")]
    public string Estado  get; set; 

    [Display(Name = "Status")]
    public bool Situacao  get; set; 

    [Display(Name = "Segmento")]
    public string Segmento  get; set; 

    [Display(Name = "Porte")]
    public string Porte  get; set; 

    public ICollection<Contato> Contato  get; set; 

 public class Contato

    [Display(Name = "Código")]
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ContatoId  get; set; 

    [Display(Name = "Nome")]
    [StringLength(50)]
    public string Nome  get; set; 

    [Required(ErrorMessage = "Informe o sobrenome")]
    [Display(Name = "Sobrenome")]
    [StringLength(40)]
    public string Sobrenome  get; set; 

    [Display(Name = "Cargo")]
    public string Cargo  get; set; 

    [Display(Name = "Setor")]
    public string Setor  get; set; 

    [Required(ErrorMessage = "Informe o seu Email")]
    [StringLength(20)]
    [Display(Name = "E-mail")]
    [EmailAddress]
    public string Email  get; set; 

    [Required(ErrorMessage = "Informe o seu telefone")]
    [StringLength(20)]
    [Display(Name = "Telefone")]
    public string Telefone  get; set; 

    [Required(ErrorMessage = "Informe o seu Celular")]
    [StringLength(20)]
    public string Celular  get; set; 

    [Display(Name = "Usuário")]
    public int? UsuarioId  get; set; 

    [ForeignKey("UsuarioId")]
    public virtual Usuario Usuarios  get; set; 

    
    public int? ClienteId  get; set; 

    [ForeignKey("ClienteId")]
    public virtual Cliente Clientes  get; set; 

视图模型

 public class ClienteViewModel

    public Cliente cliente  get; set; 


    public Contato contato  get; set; 


控制器

[HttpPost]
    public IActionResult Cadastrar(ClienteViewModel clienteViewModel)
    

        if (ModelState.IsValid)
        

            Models.Cliente cliente = new Models.Cliente
            
                Nome = clienteViewModel.cliente.Nome,
                Tipo_Pessoa = clienteViewModel.cliente.Tipo_Pessoa,
                Cpf_Cnpj = clienteViewModel.cliente.Cpf_Cnpj,
                Fantasia = clienteViewModel.cliente.Fantasia,
                IE = clienteViewModel.cliente.IE,
                Porte = clienteViewModel.cliente.Porte,
                Segmento = clienteViewModel.cliente.Segmento,
                Cep = clienteViewModel.cliente.Cep,
                Endereco = clienteViewModel.cliente.Endereco,
                Numero = clienteViewModel.cliente.Numero,
                Complemento = clienteViewModel.cliente.Complemento,
                Bairro = clienteViewModel.cliente.Bairro,
                Cidade = clienteViewModel.cliente.Cidade,
                Estado = clienteViewModel.cliente.Estado,
                Situacao = true
            ;

            _clienteRespository.Cadastrar(cliente);

            Contato contato = new Contato
            
                Nome = clienteViewModel.contato.Nome,
                Sobrenome = clienteViewModel.contato.Sobrenome,
                Telefone = clienteViewModel.contato.Telefone,
                Celular = clienteViewModel.contato.Celular,
                Email = clienteViewModel.contato.Email,
                Cargo = clienteViewModel.contato.Cargo,
                Setor = clienteViewModel.contato.Setor,
                ClienteId = cliente.ClienteId,
                Clientes = cliente
            ;

            Models.Usuario usuario = new Models.Usuario()
            
                Nome = contato.Nome,
                Sobrenome = contato.Sobrenome,
                Email = contato.Email,
                Telefone = contato.Celular,
                Cargo = contato.Cargo,
                Setor = contato.Setor,
                PerfilId = _helpers.createPerfilSuperAdministradorCliente(cliente.ClienteId).PerfilClienteId,
                Senha = contato.Email,
                Status = true
            ;
            _usuarioRespository.Cadastrar(usuario);

            clienteViewModel.contato.UsuarioId = usuario.UsuarioId;


            _clienteRespository.Cadastrar(cliente.ClienteId, contato);

            return RedirectToAction(nameof(Index));
        

        return View();
    

存储库

 public void Cadastrar(Cliente cliente)
    
        _context.Add(cliente);
        _context.SaveChanges();
    

    public void Cadastrar(int ClienteId, Contato contato)
    
        contato.ClienteId = ClienteId;
        _context.Add(contato);
        _context.SaveChanges();
    

提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

您必须修复所有存储库

public void Cadastrar(Cliente cliente)
    
        _context.Set<Cliente>().Add(cliente);
        _context.SaveChanges();
    

    public void Cadastrar(int ClienteId, Contato contato)
    
        contato.ClienteId = ClienteId;
        _context.Set<Contato>.Add(contato);
        _context.SaveChanges();
    

【讨论】:

以上是关于使用 MVVM 在基础中注册新客户端时出错的主要内容,如果未能解决你的问题,请参考以下文章

在 WPF 智能客户端应用程序中使用 WCF DTO 时理解 MVVM 使用的问题

在 android 中使用 MVVM 设计模式时出错找不到符号类 ViewModel

使用 ProcessBuilder 时客户端无法连接 RMI 注册表

如果客户端发送新的注册令牌时应用服务器离线怎么办?

注册不工作并抛出params错误

根据 Woocommerce 中的用户角色自定义客户新帐户邮件