Usuário com melhor resposta
Inserir registro com tabela relacionada

Pergunta
-
Galera estou fazendo um aplicação com windows form entity framework para estudos bom estou montando a tela de cadastro de cliente onde tenho uma tabela relacionada com a de endereço na hora de inserir ele grava os dados e pega o id do cliente e joga na tabela de endereço não estou conseguindo fazer, olha meu codigo;
private void IncluirBNT_Click(object sender, EventArgs e) { try { LivrariaContext contexto = new LivrariaContext(); Clientes clientes = new Clientes(); clientes.Nome = txNome.Text.ToUpper(); clientes.Cpf = txCPF.Text; clientes.Nascimento = dtNascim.Value; clientes.Email = txEmail.Text.ToLower(); clientes.Telefone = mskTelefone.Text; clientes.Celular = mskCelular.Text; contexto.Clientes.Add(clientes); if (ValidarClientes(clientes) == false) { Endereco endereco = new Endereco(); endereco.Cep = mskCEP.Text; endereco.Logradouro = txEndereco.Text; endereco.Numero = txNumero.Text; endereco.Complemento = txComplemento.Text; endereco.Bairro = txBairro.Text; endereco.Estado = txEstado.Text; endereco.Cidade = txCidade.Text; endereco.ClienteID = clientes.ClienteId; contexto.Endereco.Add(endereco); if (ValidarClientes(endereco) == false) { contexto.SaveChanges(); contexto.SaveChanges(); endereco.ClienteID = clientes.ClienteId; preencherGrid(); limpaCampo(); throw new Exception("Editora cadastrado com sucesso!"); } } } catch (Exception ex) { MessageBox.Show(ex.Message, "Alerta", MessageBoxButtons.OKCancel); } }
Respostas
-
Claudio,
Identifiquei dois problemas, um deles é o tipo de dados definido na DataAnnotation da propriedade ClienteId. Entre a classe Endereco e a classe Cliente elas devem ser iguais.
Outro ponto era a declaração da ForeignKey "ClienteId", sendo que não existe nenhum campo com esse nome na classe Endereco. O que existe é um campo chamado "Cliente ID" (Sim ele diferencia maísculas e minúsculas)
As classes ficaram assim:
[Table("Endereco")] public class Endereco { [Key] [Column("EnderecoID", TypeName = "INT")] public int EnderecoID { get; set; } [Column("ClienteId", TypeName = "INT")] public int ClienteID { get; set; } [MaxLength(10)] [Column("Cep", TypeName = "nchar")] public string Cep { get; set; } [Required(ErrorMessage = "Campo cep é obrigatório")] [MaxLength(60)] [Column("Logradouro", TypeName = "VARCHAR")] public string Logradouro { get; set; } [MaxLength(10)] [Column("Numero", TypeName = "nchar")] public string Numero { get; set; } [MaxLength(10)] [Column("Complemento", TypeName = "nchar")] public string Complemento { get; set; } [MaxLength(20)] [Column("Bairro", TypeName = "nchar")] public string Bairro { get; set; } [MaxLength(20)] [Column("Estado", TypeName = "nchar")] public string Estado { get; set; } [MaxLength(20)] [Column("Cidade", TypeName = "nchar")] public string Cidade { get; set; } [MaxLength(20)] [Column("Pais", TypeName = "nchar")] public string Pais { get; set; } [ForeignKey("ClienteID")] public virtual Clientes Clientes { get; set; } } [Table("Clientes")] public class Clientes { [Key] [Column("ClienteId", TypeName = "INT")] public int ClienteId { get; set; } [MaxLength(60)] [Column("Nome", TypeName = "varchar")] public string Nome { get; set; } [MaxLength(15)] [Column("Cpf", TypeName = "nchar")] public string Cpf { get; set; } [Column("Nascimento", TypeName = "datetime")] public DateTime Nascimento { get; set; } [MaxLength(60)] [Column("Email", TypeName = "varchar")] [RegularExpression(@"^(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9]+@((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6}$", ErrorMessage = "Informe um email válido")] public string Email { get; set; } [MaxLength(15)] [Column("Telefone", TypeName = "nchar")] public string Telefone { get; set; } [MaxLength(15)] [Column("Celular", TypeName = "nchar")] public string Celular { get; set; } public ICollection<Endereco> Endereco { get; set; } }
Valeu!Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!
André Secco
Microsoft MSP & MSDN Tech Advisor
Blog: http://andresecco.com.br
GitHub: http://github.com/andreluizsecco
Twitter: @andre_secco- Marcado como Resposta CLAUDIO JOSE sexta-feira, 21 de outubro de 2016 20:53
Todas as Respostas
-
Olá Claudio,
O problema está no seguinte:
Você está apenas adicionando o cliente no seu DbSet, porém não está persistindo no banco (SaveChanges) e logo em seguida já tenta adicionar um usuário, com um ClienteId que ainda não existe no banco de dados, por isso não funciona.
Então a principio se adicionar um: contexto.SaveChanges(); antes de começar a criar o endereço, irá funcionar.
Valeu!
Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!
André Secco
Microsoft MSP & MSDN Tech Advisor
Blog: http://andresecco.com.br
GitHub: http://github.com/andreluizsecco
Twitter: @andre_secco -
Mano se eu coloco o SaveChange antes de criar o objeto Endereco está aparecendo este erro:
"A instrução INSERT conflitou com a restrição do FOREIGN KEY \"FK_dbo.Clientes_dbo.Endereco_ClienteId\". O conflito ocorreu no banco de dados \"Livraria\", tabela \"dbo.Endereco\", column 'EnderecoID'.\r\nA instrução foi finalizada.
-
Poste o código para eu analisar
Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!
André Secco
Microsoft MSP & MSDN Tech Advisor
Blog: http://andresecco.com.br
GitHub: http://github.com/andreluizsecco
Twitter: @andre_secco -
Está a classe Cliente
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; //------------------- using System.Data.Entity; using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations; namespace EntiFrameWorkWF { [Table("Clientes")] public class Clientes { [Key] [Column("ClienteId", TypeName = "INT")] public int ClienteId { get; set; } [MaxLength(60)] [Column("Nome", TypeName="varchar")] public string Nome { get; set; } [MaxLength(15)] [Column("Cpf", TypeName="nchar")] public string Cpf { get; set; } [Column("Nascimento", TypeName="datetime")] public DateTime Nascimento { get; set; } [MaxLength(60)] [Column("Email", TypeName = "varchar")] [RegularExpression(@"^(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9]+@((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6}$", ErrorMessage = "Informe um email válido")] public string Email { get; set; } [MaxLength(15)] [Column("Telefone", TypeName = "nchar")] public string Telefone { get; set; } [MaxLength(15)] [Column("Celular", TypeName = "nchar")] public string Celular { get; set; } public Endereco Endereco { get; set; } } }
Essa classe Endereco:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; //------------------- using System.Data.Entity; using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations; namespace EntiFrameWorkWF { [Table("Endereco")] public class Endereco { [Key] [Column("EnderecoID", TypeName = "INT")] public int EnderecoID { get; set; } [Column("ClienteId", TypeName = "BIGINT")] public int ClienteID { get; set; } [MaxLength(10)] [Column("Cep", TypeName="nchar")] public string Cep { get; set; } [Required(ErrorMessage="Campo cep é obrigatório")] [MaxLength(60)] [Column("Logradouro", TypeName="VARCHAR")] public string Logradouro { get; set; } [MaxLength(10)] [Column("Numero", TypeName="nchar")] public string Numero { get; set; } [MaxLength(10)] [Column("Complemento", TypeName="nchar")] public string Complemento { get; set; } [MaxLength(20)] [Column("Bairro", TypeName = "nchar")] public string Bairro { get; set; } [MaxLength(20)] [Column("Estado",TypeName="nchar")] public string Estado { get; set; } [MaxLength(20)] [Column("Cidade",TypeName="nchar")] public string Cidade { get; set; } [MaxLength(20)] [Column("Pais", TypeName="nchar")] public string Pais { get; set; } [ForeignKey("ClienteId")] public virtual ICollection<Clientes> Clientes { get; set; } } }
-
Estranho.. O erro está na constraint está falando da coluna EnderecoID? Mas a coluna EnderecoID não deveria ter nada a ver com essa constraint entre Clientes e Endereco..
... tabela \"dbo.Endereco\", column 'EnderecoID'.\r\nA instrução foi finalizada.
Tem certeza que a definição da sua foreign key está correta?
André Alves de Lima
Microsoft MVP - Client App Dev
Visite o meu site: http://www.andrealveslima.com.br
Me siga no Twitter: @andrealveslima -
Isso que estou achando estranho cara descobri o que esta acontecendo na hora de criar o banco ele esta colocando a referencia na tabela de clientes olha como o entity esta criando a tabela:
CREATE TABLE [dbo].[Clientes] ( [ClienteId] INT NOT NULL, [Nome] VARCHAR (60) NULL, [Cpf] NCHAR (15) NULL, [Nascimento] DATETIME NOT NULL, [Email] VARCHAR (60) NULL, [Telefone] NCHAR (15) NULL, [Celular] NCHAR (15) NULL, CONSTRAINT [PK_dbo.Clientes] PRIMARY KEY CLUSTERED ([ClienteId] ASC), CONSTRAINT [FK_dbo.Clientes_dbo.Endereco_ClienteId] FOREIGN KEY ([ClienteId]) REFERENCES [dbo].[Endereco] ([EnderecoID]), CONSTRAINT [FK_dbo.Clientes_dbo.Pedido_ClienteId] FOREIGN KEY ([ClienteId]) REFERENCES [dbo].[Pedido] ([PedidoID])
CREATE TABLE [dbo].[Endereco] ( [EnderecoID] INT IDENTITY (1, 1) NOT NULL, [Cep] NCHAR (10) NULL, [Logradouro] VARCHAR (60) NOT NULL, [Numero] NCHAR (10) NULL, [Complemento] NCHAR (10) NULL, [Bairro] NCHAR (20) NULL, [Estado] NCHAR (20) NULL, [Cidade] NCHAR (20) NULL, [Pais] NCHAR (20) NULL, [ClienteID] INT NOT NULL, CONSTRAINT [PK_dbo.Endereco] PRIMARY KEY CLUSTERED ([EnderecoID] ASC)
- Editado CLAUDIO JOSE sexta-feira, 21 de outubro de 2016 14:54
-
Claudio,
Para começar, na sua classe Endereço, troque isso:
[ForeignKey("ClienteId")] public virtual ICollection<Clientes> Clientes { get; set; }
Por isso:
[ForeignKey("ClienteId")] public virtual Clientes Clientes { get; set; }
Na classe endereço, troque isso:
public Endereco Endereco { get; set; }
Por isso:
public ICollection<Endereco> Endereco { get; set; }
E vejamos se ocorrerá tudo bem.
Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!
André Secco
Microsoft MSP & MSDN Tech Advisor
Blog: http://andresecco.com.br
GitHub: http://github.com/andreluizsecco
Twitter: @andre_secco -
Desculpa a demora desse jeito aparece esse erro quando vou criar o diagrama com entity:
The property 'ClienteID' cannot be configured as a navigation property. The property must be a valid entity type and the property should have a non-abstract getter and setter. For collection properties the type must implement ICollection<T> where T is a valid entity type.
-
Claudio,
Identifiquei dois problemas, um deles é o tipo de dados definido na DataAnnotation da propriedade ClienteId. Entre a classe Endereco e a classe Cliente elas devem ser iguais.
Outro ponto era a declaração da ForeignKey "ClienteId", sendo que não existe nenhum campo com esse nome na classe Endereco. O que existe é um campo chamado "Cliente ID" (Sim ele diferencia maísculas e minúsculas)
As classes ficaram assim:
[Table("Endereco")] public class Endereco { [Key] [Column("EnderecoID", TypeName = "INT")] public int EnderecoID { get; set; } [Column("ClienteId", TypeName = "INT")] public int ClienteID { get; set; } [MaxLength(10)] [Column("Cep", TypeName = "nchar")] public string Cep { get; set; } [Required(ErrorMessage = "Campo cep é obrigatório")] [MaxLength(60)] [Column("Logradouro", TypeName = "VARCHAR")] public string Logradouro { get; set; } [MaxLength(10)] [Column("Numero", TypeName = "nchar")] public string Numero { get; set; } [MaxLength(10)] [Column("Complemento", TypeName = "nchar")] public string Complemento { get; set; } [MaxLength(20)] [Column("Bairro", TypeName = "nchar")] public string Bairro { get; set; } [MaxLength(20)] [Column("Estado", TypeName = "nchar")] public string Estado { get; set; } [MaxLength(20)] [Column("Cidade", TypeName = "nchar")] public string Cidade { get; set; } [MaxLength(20)] [Column("Pais", TypeName = "nchar")] public string Pais { get; set; } [ForeignKey("ClienteID")] public virtual Clientes Clientes { get; set; } } [Table("Clientes")] public class Clientes { [Key] [Column("ClienteId", TypeName = "INT")] public int ClienteId { get; set; } [MaxLength(60)] [Column("Nome", TypeName = "varchar")] public string Nome { get; set; } [MaxLength(15)] [Column("Cpf", TypeName = "nchar")] public string Cpf { get; set; } [Column("Nascimento", TypeName = "datetime")] public DateTime Nascimento { get; set; } [MaxLength(60)] [Column("Email", TypeName = "varchar")] [RegularExpression(@"^(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9]+@((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6}$", ErrorMessage = "Informe um email válido")] public string Email { get; set; } [MaxLength(15)] [Column("Telefone", TypeName = "nchar")] public string Telefone { get; set; } [MaxLength(15)] [Column("Celular", TypeName = "nchar")] public string Celular { get; set; } public ICollection<Endereco> Endereco { get; set; } }
Valeu!Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!
André Secco
Microsoft MSP & MSDN Tech Advisor
Blog: http://andresecco.com.br
GitHub: http://github.com/andreluizsecco
Twitter: @andre_secco- Marcado como Resposta CLAUDIO JOSE sexta-feira, 21 de outubro de 2016 20:53
-