none
Inserir registro com tabela relacionada RRS feed

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

    sexta-feira, 21 de outubro de 2016 12:24

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
    sexta-feira, 21 de outubro de 2016 19:29

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

    sexta-feira, 21 de outubro de 2016 12:43
  • 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.

    sexta-feira, 21 de outubro de 2016 13:21
  • 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

    sexta-feira, 21 de outubro de 2016 13:24
  • 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; }
        }
    }
    

    sexta-feira, 21 de outubro de 2016 13:37
  • 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

    sexta-feira, 21 de outubro de 2016 13:40
    Moderador
  • 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
    sexta-feira, 21 de outubro de 2016 13:49
  • 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

    sexta-feira, 21 de outubro de 2016 15:51
  • 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.

    sexta-feira, 21 de outubro de 2016 17:58
  • 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
    sexta-feira, 21 de outubro de 2016 19:29
  • Cara finalmente consegui ptz quebrei a cabeça mais chegui aonde queria preciso estudar mais o relacionamento de tabelas valeu revisei minhas classe tinhas alguns campos em conflitos e agora está ok
    sexta-feira, 21 de outubro de 2016 20:53