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ódigo

public 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ódigo
update 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.,