Eu tenho explorado diferentes métodos de edição / atualização de um registro no Entity Framework 5 em um ambiente ASP.NET MVC3, mas até agora nenhum deles marque todas as caixas necessárias. Eu vou explicar o porquê.
Encontrei três métodos aos quais mencionarei os prós e os contras:
Método 1 - Carregar registro original, atualizar cada propriedade
var original = db.Users.Find(updatedUser.UserId);
if (original != null)
{
original.BusinessEntityId = updatedUser.BusinessEntityId;
original.Email = updatedUser.Email;
original.EmployeeId = updatedUser.EmployeeId;
original.Forename = updatedUser.Forename;
original.Surname = updatedUser.Surname;
original.Telephone = updatedUser.Telephone;
original.Title = updatedUser.Title;
original.Fax = updatedUser.Fax;
original.ASPNetUserId = updatedUser.ASPNetUserId;
db.SaveChanges();
}
Prós
- Pode especificar quais propriedades são alteradas
- As visualizações não precisam conter todas as propriedades
Contras
- 2 x consultas no banco de dados para carregar o original e atualizá-lo
Método 2 - Carregar registro original, definir valores alterados
var original = db.Users.Find(updatedUser.UserId);
if (original != null)
{
db.Entry(original).CurrentValues.SetValues(updatedUser);
db.SaveChanges();
}
Prós
- Somente propriedades modificadas são enviadas ao banco de dados
Contras
- As visualizações precisam conter todas as propriedades
- 2 x consultas no banco de dados para carregar o original e atualizá-lo
Método 3 - Anexe o registro atualizado e defina o estado como EntityState.Modified
db.Users.Attach(updatedUser);
db.Entry(updatedUser).State = EntityState.Modified;
db.SaveChanges();
Prós
- 1 x consulta no banco de dados para atualizar
Contras
- Não é possível especificar quais propriedades são alteradas
- As visualizações devem conter todas as propriedades
Questão
Minha pergunta para vocês; existe uma maneira limpa de atingir esse conjunto de metas?
- Pode especificar quais propriedades são alteradas
- As visualizações não precisam conter todas as propriedades (como senha!)
- 1 x consulta no banco de dados para atualizar
Entendo que isso é uma coisa muito pequena a ser destacada, mas posso estar perdendo uma solução simples para isso. Caso contrário, prevalecerá o método ;-)