Cuando tenemos una colección de objetos obtenida de la base de datos y queremos actualizar un registro de la siguiente manera:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
IEnumerable<Mensajes> result = db.Mensajes.Where(m => m.IdUsuario == IdUsuario); foreach (Mensajes mensaje in result) { if (mensaje.Leido == 0) { Mensajes mensajeCambiarLeido = db.Mensajes.FirstOrDefault(m => m.IdMensaje == mensaje.IdMensaje); mensajeCambiarLeido.Leido = 1; db.Entry(mensajeCambiarLeido).State = EntityState.Modified; try { db.SaveChanges(); } catch (DbUpdateConcurrencyException ex) { } } } |
Cuando guardemos los cambios recibiremos la siguiente excepción:
New transaction is not allowed because there are other threads running in the session.
Esto es debido a que en realidad no tenemos una colección de objetos, sino un enumerador que puede devolver objetos. Mientras el anterior esté en uso, permanecerá el recurso abierto.
Deberemos utilizar el metodo «ToList()» para convertir este enumerador en colección y cerrar el recurso de Linq, esto nos permitirá utilizarlo para realizar otras operaciones.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
IEnumerable<Mensajes> result = db.Mensajes.Where(m => m.IdUsuario == IdUsuario).ToList(); foreach (Mensajes mensaje in result) { if (mensaje.Leido == 0) { Mensajes mensajeCambiarLeido = db.Mensajes.FirstOrDefault(m => m.IdMensaje == mensaje.IdMensaje); mensajeCambiarLeido.Leido = 1; db.Entry(mensajeCambiarLeido).State = EntityState.Modified; try { db.SaveChanges(); } catch (DbUpdateConcurrencyException ex) { } } } |