none
Excluir em listas internas com POCO RRS feed

  • Pergunta

  • Estou trabalhando em um projeto com EF4 e as classes POCO escritas por mim mesmo. Estou com a seguinte dificuldade.

    Tenho uma classe Pessoa que possui uma coleção de contatos.
    Quando eu removo um destes contatos da coleção e tento salvar o objeto ele me devolve o seguinte erro:

    A relationship from the 'FK__Contato__PessoaI__214BF109' AssociationSet is in the 'Deleted' state. Given multiplicity constraints, a corresponding 'Contato' must also in the 'Deleted' state.

    Vi em alguns sites que isso tem a ver com Cascade na tabela, mas na minha tabela não tem nada definido com relação a Cascade Delete e nem no mapeamento.

    quarta-feira, 9 de fevereiro de 2011 16:38

Todas as Respostas

  • Amigo, ai é que está se você tivesse definido o cascade na sua tabela o procedimento séria mais fácil. Sem nada definido o Entity Framework não sabe o que fazer e tenta exclir o objeto. o BD nega o comando e retorna o erro. da uma olhada aqui:http://olavooneto.wordpress.com/2011/01/26/linq-to-entity-dicas/ no item 2
    Olavo Oliveira Neto
    http://olavooneto.wordpress.com
    Se for útil marque como resposta e faça um Developer feliz :)
    quinta-feira, 10 de fevereiro de 2011 11:37
  • Everson posta seu code eu to achando que vc vai ter que usar unitofwork

    Não esqueça de usar o componente </> na barra para posta seu código.
    quinta-feira, 10 de fevereiro de 2011 19:47
  • Minha classe pessoa está construída da seguinte forma:

    public class Pessoa
    {
    public Guid Id {get; protected set;}
    public string Nome {get; protected set;}
    protected virtual IList<Contato> ContatosInterno {get;set;}
    public IEnumerable<Contato> Contatos 
    {
       get { return ContatosInterno.AsEnumerable(); }
    }
    
    public void AdicionarContato(Guid id, string descricao, TipoContato tipoContato)
    {
       ContatosInterno.Add(new Contato(id, descricao, tipoContato));
    }
    
    public void RemoverContato(Guid id)
    {
       ContatosInterno.Remove(ContatosInterno.First(c => c.Id.Equals(id)));
    }
    

    Meu código para remoção do contato é o seguinte:

    using (var ctx = new Entities())
    {
      var pessoa = ctx.Pessoa.First(p => p.Id.Equals(pessoaId));
      pessoa.RemoverContato(contatoId);
      ctx.SaveChanges();
    }

    Já coloquei o Cascade no relacionamento e não funciona.

    Já não sei mais como resolver.

    sexta-feira, 11 de fevereiro de 2011 11:47
  • alem do cascade, você colocou o include ?

    Olavo Oliveira Neto
    http://olavooneto.wordpress.com
    Se for útil marque como resposta e faça um Developer feliz :)
    sexta-feira, 11 de fevereiro de 2011 12:19
  • Eu estou removendo um filho q está numa coleção interna ao objeto pai. Não entendo como faria um include neste caso.

    sexta-feira, 11 de fevereiro de 2011 12:48