Olá,
O Entity Framework, como todos sabem, é uma ferramenta de mapeamento objeto-relacional. E realiza ações como seleção, inclusão, atualização e exclusão de dados. Dentre estas simples operações podemos ter controle de grande parte de seu funcionamento.
Assim como podemos, em uma query, selecionar apenas um conjunto de campos que queremos recuperar do banco de dados, podemos indicar que queremos apenas atualizar um conjunto de campos, não toda a estrutura da entidade sob edição.
Vamos supor um exemplo simples: temos um recurso em nosso sistema que deve executar a atualização do e-mail de nosso usuário. Nossa aplicação deve ser capaz de atualizar apenas o campo e-mail de nosso banco de dados, sem atualizar nenhum outro campo no banco de dados (mesmo que seja com seus valores atuais). Para tanto, devemos fazer algo como o código abaixo:
Usuario novoUsuario = new Usuario(); novoUsuario.Email = "fernando@hotmail.com"; novoUsuario.Nome = "Fernando Henrique"; using (Contexto dataBase = new Contexto()) { dataBase.Usuarios.Add(novoUsuario); dataBase.SaveChanges(); } novoUsuario.Email = "fernando@outlook.com"; using (Contexto dataBase = new Contexto()) { dataBase.Usuarios.Attach(novoUsuario); // Marcar a propriedade E-Mail como modificada dataBase.Entry(novoUsuario).Property(u => u.Email).IsModified = true; dataBase.SaveChanges(); }
O que estamos fazendo é bastante simples, estamos apenas acessando a coleção de propriedades mapeadas pelo Entity Framework e marcando a propriedade que queremos atualizar como modificada. Fácil não?
Por
Fernando Henrique Inocêncio Borba Ferreira
Microsoft Most Valuable Professional – Data Platform Development
Parabéns …
Eu estava precisando disto, mas meu caso é diferente.
Tenho duas classes:
* Anexo
– int id
– string nome
– byte[] arquivo
* Contas a pagar
– int id
– string descrição
– anexo boleto
Quero atualizar só o boleto do contas a pagar, mas não funcionou.
public void AtualizaBoleto(ContasaPagar entidade)
{
try
{
using (var banco = new Contexto())
{
banco.ContasApagar.Attach(entidade);
banco.Entry(entidade).Property(u => u.Boleto).IsModified = true;
banco.SaveChanges();
}
}
catch (Exception)
{
throw;
}
}
Erro: Attaching an entity of type ‘BE.Anexo’ failed because another entity of the same type already has the same primary key value. This can happen when using the ‘Attach’ method or setting the state of an entity to ‘Unchanged’ or ‘Modified’ if any entities in the graph have conflicting key values. This may be because some entities are new and have not yet received database-generated key values. In this case use the ‘Add’ method or the ‘Added’ entity state to track the graph and then set the state of non-new entities to ‘Unchanged’ or ‘Modified’ as appropriate.
O erro acontece no Attach.
Atualizar somente 1 campo:
db.Users.Attach(user);
db.Entry(user).Property(x => x.Password).IsModified = true;
db.SaveChanges();
Muito Obrigado!!! Estava aqui caçando como resolver meu problema e seu trecho de código me ajudou bastante.