Integro con un pezzettino di codice, cio che bisogna cambiare (se il problema è quello che penso io) è il foreach:
codice:
foreach(User vmu in users)
{
User user = db.User.Find(vmu.ID); //Pesco il vero user attraverso l'id dell'user "contenitore"
if (null == user)
throw InvalidOperationException(); // L'user nel frattempo è sparito sicuramente c'è stato un errore di concorrenza e tutta l'operazione dovrebbe essere anullata. Potresti gestirla anche in modo piu pulito questa cosa per esempio aggiungendo un errore al modelstate.
user.Nome = vmu.Nome;
user.Cognome = vmu.Cognome;
//e cosi via per tute le proprietà da modificare...
db.Entry(user).State = EntityState.Modified;
}
db.SaveChanges();