Inquiridor
problema com update e entity framework

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
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!
-
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
- Sugerido como Resposta Cesar Mendes da Silva terça-feira, 14 de abril de 2015 19:58
- Não Sugerido como Resposta Cesar Mendes da Silva terça-feira, 14 de abril de 2015 19:59
-
-
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.
- Sugerido como Resposta alexandre_cavaleiro quarta-feira, 22 de abril de 2015 13:41