none
problema com update e entity framework RRS feed

  • Pergunta

  • Pessoal, poderiam me ajudar com um update ?

    tenho as classes poi e contatoPoi:

    namespace _Entidades.T0030_Poi
    {
    [Table("t0033_contato")]
    public class PoiContatoModel
    {
    [Key]
    [Required]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int t0033_id_contato { get; set; }

    [Required]
    public string t0033_nome_contato { get; set; }

    [Required]
    public int t0031_id_poi { get; set; }

    [Required]
    public string t0033_tipo_enum { get; set; }

    [Required]
    public string t0033_valor_enum { get; set; }

    [ForeignKey("t0031_id_poi")]
    public virtual PoiModel PoiModel { get; set; }
    }
    }

    [Table("t0031_poi")]
    public class PoiModel
    {
    [Key]
    [Required]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int t0031_id_poi { get; set; }

    [Required] 
    public int t0030_id_tipo_poi { get; set; }

    [Required]
    public string t0031_razao { get; set; } 

    [Required]
    public DateTime t0031_dt_cadastro { get; set; }

    [ForeignKey("t0030_id_tipo_poi")]
    public virtual TipoPoiModel TipoPoiModel { get; set; }

    public virtual ICollection<PoiContatoModel> Contatos { get; set; }

    }


    para inserir um objeto, tenho um metodo Save, passo o objeto populado com uma coleção de contatos, funciona certinho.

    O problema esta para atualizar, passo o mesmo objeto populado e com uma coleção de contatos, porem somente a tabela poi esta sendo atualizada, na tabela contato nao acontece nada. Abaixo esta o metodo de atualização:

    public dynamic Atualizar(TEntity obj)
    {
    dynamic data = null;
    using (ClassContexto ctx = new ClassContexto(ClassMaster.conexao()))
    {
    try
    {
    ctx.Entry(obj).State = EntityState.Modified; 
    ctx.SaveChanges();
    data = "200";
    }
    catch (DbEntityValidationException e)
    {
    data = e.EntityValidationErrors;
    }
    catch (Exception erro)
    {
    //tratar
    }
    finally
    {
    }
    }
    return data;
    }


    o que poderia estar errado :


    alessandre

    terça-feira, 14 de abril de 2015 19:15

Todas as Respostas

  • Não sei exatamente como você está fazendo, tem apenas a chamada para o Entity Framework. Portanto, quando for dar update, o ideal é você buscar o registro na base, alterar os campos necessários e depois atualizar conforme o código. Dessa forma você está garantindo que o Id e Fks estão corretas.

    Suas entidades estão com campos obrigatórios, portanto, dá uma olhada se os valores estão corretos!

    terça-feira, 14 de abril de 2015 19:32
  • Entao cesar, os valores estao corretos, tentei tb da forma que vc disse, e nao deu certo.

    Veja a forma que populo os objetos

    *apesar de nao colocar aqui, fiz como vc disse, buscando o objeto do banco.

      [TestMethod]
            public void updatePoiContato2()
            {           

                poiModel.t0031_id_poi = 56;
                poiModel.t0030_id_tipo_poi = 2;
               // poiModel.t0030_id_tipo_poi = poiModel.t0030_id_tipo_poi;
                poiModel.t0031_razao = "TESTE UPDATE" + DateTime.Now.ToString();
                poiModel.t0031_fantasia = "TESTE UPDATE" + DateTime.Now.ToString();
                poiModel.t0031_cnpj_cpf = "12.935.236/0001-97";
                poiModel.t0031_ie_rg = "234234324234";
                poiModel.t0031_situacao = 1;
                poiModel.t0031_dt_cadastro = poiModel.t0031_dt_cadastro;
                poiModel.t0031_alldata = poiModel.t0031_razao + poiModel.t0031_fantasia + poiModel.t0031_cnpj_cpf + poiModel.t0031_ie_rg;


                PoiContatoModel model1 = new PoiContatoModel();
                model1.t0031_id_poi = 56;
                model1.t0033_id_contato = 6;
                model1.t0033_nome_contato = "TESTE UPDATE";
                model1.t0033_tipo_enum = "CELULAR";
                model1.t0033_valor_enum = "41-9174-3185";

                PoiContatoModel model2 = new PoiContatoModel();
                model2.t0031_id_poi = 56;
                model2.t0033_id_contato = 7;           
                model2.t0033_nome_contato = "TESTE UPDATE";
                model2.t0033_tipo_enum = "CELULAR";
                model2.t0033_valor_enum = "41-9174-3185";

                ICollection<PoiContatoModel> contatos = new List<PoiContatoModel>();
                contatos.Add(model1);
                contatos.Add(model2);

                poiModel.Contatos = contatos;            

                var result = poiDto.save(poiModel, "100", "a");
                Assert.AreEqual(true, result.Contains("200"));
            }


    alessandre

    terça-feira, 14 de abril de 2015 19:48
  • Tenta salvar a coleçao sem incluir na entidade "pai" faz um foreach e adiciona individualmente os contatos.

    forearch(var item in contatos)

    {

    context.Entry(item).State = Modified;

    }

    context.SaveChanges();

    terça-feira, 14 de abril de 2015 20:03
  • Alessandre, passei o final de semana com um problema parecido.
    Só pra ficar claro, vou descrever o que entendi:
    Você tem as classes A e B, sendo que a classe B possui uma FK da Classe A, sendo assim você tem uma lista de B na classe A.

    public class A
    {
      public int Id { get; set; }
      public string Nome {get; set; }
      public virtual ICollection<B> Lista { get; set; }
    }
    
    public class B
    {
      public int Id { get; set; }
      public string Nome { get; set; }
      public int IdA { get; set; } // FK do A
      public A ObjetoA { get; set; }
    }

    Para você fazer o insert de um novo ítem na lista, além de você alterar o modo da classe A para Modificado, você precisa setar o modo dos ítens da lista também:

    public void Atualizar(A objetoA)
    {
      objContex = new OBJCONTEXT();
      foreach(var b in objetoA.Lista)
      {
        objContext.Entry(b).State = b.Id.Equals(0)? EntityState.Added : EntityState.Modified;
      }
      objContext.Entry(objetoA).State = EntityState.Modified;
      objContext.SaveChanges();
    }

    Nesse caso, eu verifico ítem por ítem da lista pra saber se tem ítem novo e assim, adicioná-los, ou atualizar os já existentes, bem como o objeto "principal".

    Se você tiver mais de uma coleção dentro do objeto, você vai precisar fazer essa rotina pra cada uma.

    terça-feira, 14 de abril de 2015 21:41