Array
(
)

Como escrever esse UPDATE em expressão lambda?

Ricardo
   - 12 mai 2016

Boa tarde,
Estou enfrentando muitos problemas com essas expressões lambdas. Preciso fazer um update em apenas 3 colunas, sendo que em apenas uma delas o usuário vai digitar o valor.
O grande problema é que se eu não carrego todos os dados na view, todas as colunas da tabela perdem o valor que estava lá, ficando apenas os que eu exibi e o novo valor.
O update seria no caso da demissão de um funcionário, quando o usuário demitir o funcionário a aplicação troca o valor da coluna StatusFunc para Inativo, guarda a data da alteração e a data de demissão digitada pelo usuário.
Como eu devo fazer isso? Na view eu utilizei o template Edit, e deixei apenas os campos Nome, Nº de Registro, Data de Admissão e o Data de Demissão que será salvo na tabela. Segue o código da action, ele está dando erro na hora de salvar os dados, parece que o objeto fucionario perde os valores dos atributos que não estão na view...
#Códigopublic ActionResult Teste(long id)
{
var funcionario = db.Funcionarios.Find(id);
ViewBag.IDArea = new SelectList(db.Areas, "IDArea", "Nome", funcionario.IDArea);
ViewBag.IDCargo = new SelectList(db.Cargos, "IDCargo", "Nome", funcionario.IDCargo);
ViewBag.IDEmpregador = new SelectList(db.Empregadores, "IDEmpregador", "Nome", funcionario.IDEmpregador);
return View(funcionario);
}
[HttpPost]
public ActionResult Teste(Funcionarios funcionario)
{
if (ModelState.IsValid)
{
funcionario.StatusFunc = "Inativo";
funcionario.UltimaAtualizacao = DateTime.Now;

db.Entry(funcionario).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("FuncionariosAtivos");
}
return View(funcionario);
}

O comando em SQL seria mais ou menos assim:
#Códigoupdate Funcionarios
set StatusFunc = 'Inativo',
UltimaAtualizacao= GETDATE(),
DataDesligamento = 'funcionario.DataDesligamento - DIGITADO PELO USUÁRIO'
where IDFuncionario = @id

Obrigado.

Ricardo
   - 13 mai 2016

Boa tarde,

Consegui fazer o update em apenas 3 colunas do banco de dados, porem acho que deve ter uma forma melhor para fazer isso, pois no exemplo que encontrei eu tenho que citar todas as colunas do banco e falar quais sofrerão alteração e quais não sofrerão, se a tabela tiver 30 colunas e eu precisar alterar apenas uma o comando vai ficar gigante..

Segue o comando que utilizei:
#Código[HttpPost]
public ActionResult Demitir(Funcionarios funcionario)
{
if (ModelState.IsValid)
{
funcionario.StatusFunc = "Inativo";
funcionario.UltimaAtualizacao = DateTime.Now;

db.Funcionarios.Attach(funcionario);
var teste = db.Entry(funcionario);
teste.Property("Nome").IsModified = false;
teste.Property("Registro").IsModified = false;
teste.Property("Ramal").IsModified = false;
teste.Property("DTNasc").IsModified = false;
teste.Property("IDArea").IsModified = false;
teste.Property("IDCargo").IsModified = false;
teste.Property("IDEmpregador").IsModified = false;
teste.Property("DTAdmissao").IsModified = false;
teste.Property("HrEntra").IsModified = false;
teste.Property("Hrsai").IsModified = false;
teste.Property("TipoFunc").IsModified = false;
teste.Property("CPF").IsModified = false;
teste.Property("StatusFunc").IsModified = true;
teste.Property("UltimaAtualizacao").IsModified = true;
teste.Property("DataDesligamento").IsModified = true;

db.SaveChanges();

return RedirectToAction("FuncionariosAtivos");
}

return View(funcionario);
}


Só alterei as 3 ultimas colunas, as duas primeiras eu defini o valor na própria action e o valor da terceira coluna é digitado pelo usuário na view.

Existe uma forma melhor de fazer esse update?

Att.,