none
Deletar entidade one-to-many com EF4 RRS feed

  • Pergunta

  • Pessoal,

    Tenho uma entidade Contato que possui uma Lista de Telefone, como faço para deletar um contato e todos seus respectivos telefones??

    estou fazendo da seguinte maneira:

    contato objContato = null;
    ContatoBo contatos = new ContatoBo();
    List<contato> lst = contatos.Find(contato => contato.id_contato == id);
    
    if (lst.Count > 0)
    {
       objContato = lst[0];
       contatos.Delete(objContato);
       contatos.SaveChanges();
    }
    

    mas me retorna erro falando que não pode deletar por causa da FK

    Qual a maneira correta de fazer um delete nesse caso?


    http://projetofinal.wordpress.com/
    quarta-feira, 15 de setembro de 2010 00:23

Respostas

  • Amigo, não sei se seja o mesmo caso, mas veja se ajuda.

    meu cenario eu tenho uma entidade reuniões que se relaciona com reunioesPorUsuario

    eu nao conseguia deletar ela tambem até fazer o seguinte:

    1. Abri o editor do EDMX, cliquei em cima do relacionamento entre as duas entidades e setei a propriedade End1 OnDelete para CASCADE(END1 no meu caso seria reunião). Salva
    2. mudei o meu codigo para incluir as tabelas de dependencia com o metodo INCLUDE, segue abaixo:
    3. nHibernateModel.nHibernateEntities entities = new nHibernateModel.nHibernateEntities();
          
          try
          {
            var reuniao = entities.Reuniaos.Include("ReuniaoPorUsuarios").First();
            
            entities.DeleteObject(reuniao);
            entities.SaveChanges();
      
          }
          catch (Exception ex)
          {
            
            throw;
          }
      
    quarta-feira, 15 de setembro de 2010 13:18
  • Olavo, obrigado pela ajuda.. deu certo agora.

    contatosEntities entidades = new contatosEntities();
    var teste = entidades.contato.Include("telefone").Single(a => a.id_contato == id);
    entidades.DeleteObject(teste);
    entidades.SaveChanges();

     

     

     

    ai no EDMX no relacionamento OnDelete deixei com cascade..

    valeu!!


    ----------------------- www.leandroprado.com.br
    quinta-feira, 23 de setembro de 2010 17:54

Todas as Respostas

  • Amigo, não sei se seja o mesmo caso, mas veja se ajuda.

    meu cenario eu tenho uma entidade reuniões que se relaciona com reunioesPorUsuario

    eu nao conseguia deletar ela tambem até fazer o seguinte:

    1. Abri o editor do EDMX, cliquei em cima do relacionamento entre as duas entidades e setei a propriedade End1 OnDelete para CASCADE(END1 no meu caso seria reunião). Salva
    2. mudei o meu codigo para incluir as tabelas de dependencia com o metodo INCLUDE, segue abaixo:
    3. nHibernateModel.nHibernateEntities entities = new nHibernateModel.nHibernateEntities();
          
          try
          {
            var reuniao = entities.Reuniaos.Include("ReuniaoPorUsuarios").First();
            
            entities.DeleteObject(reuniao);
            entities.SaveChanges();
      
          }
          catch (Exception ex)
          {
            
            throw;
          }
      
    quarta-feira, 15 de setembro de 2010 13:18
  • Boa Tarde

    Vc está usando NHibernate ou Entity Framework???


    http://projetofinal.wordpress.com/
    quarta-feira, 15 de setembro de 2010 16:41
  • entity
    quarta-feira, 15 de setembro de 2010 16:58
  • é que sua variavel estava com o nome NHibernate..

    tentei fazer o q vc falou, mas nao deu certo... da o mesmo erro...

     


    http://projetofinal.wordpress.com/
    quarta-feira, 15 de setembro de 2010 17:01
  • ah sim, é o nome do meu banco é nHibernate q era um teste q eu tava fazendo antes.

    vc mudou o relacionamento la no editor do edmx ?

    pode colocar o erro aqui ?

    quarta-feira, 15 de setembro de 2010 17:02
  • gera um erro de FK

    alterei a propriedade onDelete para cascade mas mesmo assim gera esse erro:

    {"The DELETE statement conflicted with the REFERENCE constraint \"FK_telefone_contato\". The conflict occurred in database \"contatos\", table \"dbo.telefone\", column 'id_contato'.\r\nThe statement has been terminated."}


    http://projetofinal.wordpress.com/
    quarta-feira, 15 de setembro de 2010 20:56
  • Amigo

     vc esta fazendo assim ?

    eu não sei como esta o nome do seu edmx, mas digamos que seja TelefoneEntities
         
    var lst = TelefoneEntities.contatos.Incluse("Telefone").where(c=>c.id_contato ==id).toList();

    desculpe se alguma sintaxe estiver errada, a máquina que estou usando está sem o VS.

    quarta-feira, 15 de setembro de 2010 23:07
  • Chico,

    Seria interessante você postar qual é a hierarquia das tabelas que são relacionadas com Contato... Pelo que entendi, você está tentando deletar um Contato que está sendo utilizado em alguma outra tabela... Aí vai dar erro mesmo...

    Do jeito que você está fazendo, é como se você estivesse dando um DELETE na tabela de Contatos onde o id é igual a alguma coisa... Se você tentar deletar esse mesmo contato da mesma forma direto no banco, também vai dar erro...

    A solução é você deletar (ou limpar, se for possível) primeiro os objetos que estão referenciando aquele contato que você está querendo excluir...


    André Alves de Lima
    Visite o meu site: http://andrealveslima.spaces.live.com
    Me siga no Twitter: @andrealveslima
    quinta-feira, 16 de setembro de 2010 00:31
    Moderador
  • André,

    Conforme relatei acima, tenho uma entidade Contato e uma entidade Telefone, onde 1 contato possui N telefones..

    Quando tento deletar um contato o EF ja tinha que deletar os telefones desse contato...

    Agora como posso fazer isso?? Essa é a grande dúvida....

    Olávo,

    Estou tentando deletar da seguinte maneira: primeiro carrego o objeto do banco e depois tento deletar.

    ContatoBo contatos = new ContatoBo();
    List<contato> lst = contatos.Find(contato => contato.id_contato == id);
    
    if (lst.Count > 0)
    {
      objContato = lst[0];
      contatos.Delete(objContato);
      contatos.SaveChanges();
    }
    

    Obrigao pela ajuda!


    http://projetofinal.wordpress.com/
    quinta-feira, 16 de setembro de 2010 03:20
  • esse teu objeto do banco é um o q ? um edmx ?
    sexta-feira, 17 de setembro de 2010 16:48
  • Olavo, obrigado pela ajuda.. deu certo agora.

    contatosEntities entidades = new contatosEntities();
    var teste = entidades.contato.Include("telefone").Single(a => a.id_contato == id);
    entidades.DeleteObject(teste);
    entidades.SaveChanges();

     

     

     

    ai no EDMX no relacionamento OnDelete deixei com cascade..

    valeu!!


    ----------------------- www.leandroprado.com.br
    quinta-feira, 23 de setembro de 2010 17:54
  • que bom, vc poderia marcar como resposta ? :)

     

    Obrigado

    quinta-feira, 23 de setembro de 2010 18:04
  • Chico,

    Poderia, como o Olavo disse, marcar o(s) post(s) que te ajudaram a resolver essa situação? Eu poderia fazer isso, mas, não consegui identificar se algum dos posts ajudou na solução do caso...

    Caso nenhum tenha te ajudado, marque o seu último post como resposta (aquele em que você postou a solução utilizada para resolver o problema)...

    Obrigado pelo apoio.


    André Alves de Lima
    Visite o meu site: http://andrealveslima.spaces.live.com
    Me siga no Twitter: @andrealveslima
    quinta-feira, 23 de setembro de 2010 18:39
    Moderador