public Usuario Obtener(int id) { Usuario usuario = new Usuario(); using (var context = new RedSocialContext()) { try { usuario = context.Usuario .Where(x => x.id == id).Single(); // Damos formato a la fecha en yyyy/mm/dd usuario.FechaNacimiento = ViewHelper.ConvertToDate(usuario.FechaNacimiento); // Ahora obtenemos su foto usuario.Foto = context.Foto.Where( x => x.Relacion == FotoRelacion + usuario.id).SingleOrDefault(); // Si la foto no existe le ponemos una por defecto if (usuario.Foto == null) { usuario.Foto = new Foto(); } /* Ahora obtenemos los conocimientos de nuestro usuario, pero vamos a traerlos de la tabla conocimiento * para esto haremos un LINQ INNER JOIN */ usuario.UsuarioConocimientos = (from c in context.Conocimientos.ToList() join cu in context.UsuarioConocimiento.ToList() on c.id equals cu.Conocimiento_id where cu.Usuario_id == usuario.id orderby c.Nombre select cu).ToList(); /* Como en nuestra entidad UsuarioConocimiento le hemos indicado que son llaves foraneas, el entity framework * ha llegando los objetos Usuario y Conocimiento de esta clase automaticamente */ } catch (Exception e) { ELog.Save(this, e); } } return(usuario); }
public ResponseModel Actualizar(Usuario usuario, HttpPostedFileBase file) { using (var context = new RedSocialContext()) { try { if (file != null) { // Este es un helper que yo cree para crear copias de imagenes y validar, no existe en el marco de ASP.NET MVC var rpta = ImageHelper.TryParse(file, 500); if (rpta != "") { rm.SetResponse(false, rpta); // Lanzamos una exception en caso que la imagen no sea válida throw new Exception(rpta); } /* Ahora debemos guardar la foto, agregando el ID del usuario al campo Relacion de la tabla Foto * Lo que hice fue crear un Modelo que implemente la logica de guardar una foto en la base de datos * y crear copia usando el Helper que yo creo para Imagenes */ FotoModel.Registrar(context, file, new int[] { 500, 300, 100 }, FotoRelacion + usuario.id); } // Quitamos la validacion context.Configuration.ValidateOnSaveEnabled = false; // Registramos la entidad var ctxUsuario = context.Entry(usuario); // Le indicamos que es del tipo Update ctxUsuario.State = EntityState.Modified; // Seteamos la fecha al formato YYYY/MM/DD usuario.FechaNacimiento = ViewHelper.ConvertToDate(usuario.FechaNacimiento); // Url del Usuario usuario.Url = ViewHelper.ConvertNameToUrl(usuario.Nombre, usuario.Apellido, usuario.id.ToString()); // Campos que no queremos que toque ctxUsuario.Property(x => x.Admin).IsModified = false; if (usuario.Contrasena == null) { ctxUsuario.Property(x => x.Contrasena).IsModified = false; // Retiramos contrasena de la actualizacion } else { usuario.Contrasena = HashHelper.MD5(usuario.Contrasena); // Si la contraseña ha sido cambiada la actualizamos a MD5 } /* Antes de agregar los conocimientos debemos borrar los conocimientos que ya tenga este usuario * para evitar registros duplicados. Si seguimos el esquema de entity framework, primero tendriamos * que traer todo los conocimientos que tiene este usuario e indificarle que los elimine. Pero * esto no me parece muy optimo, ya que si tuviera 1000 conocimientos, hariamos demasiados querys */ // Asi que la solucion es hacer un query manual context.Database.ExecuteSqlCommand("DELETE FROM UsuarioConocimiento WHERE usuario_id = @usuario_id", new SqlParameter("usuario_id", usuario.id)); // Agregamos los conocimientos if (usuario.UsuarioConocimientos != null) { // Indicamos que el estado es del tipo insert foreach (var c in usuario.UsuarioConocimientos) { context.Entry(c).State = EntityState.Added; } } // Grabamos context.SaveChanges(); rm.SetResponse(true); if (file != null) { rm.href = "self"; } } catch (Exception e) { ELog.Save(this, e); } } return(rm); }