使用 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