none
¿como actualizo datos de una base de datos usando EntityFramework estoy con asp.net mvc5? y ¿como muestro los datos bien? RRS feed

  • Pregunta

  • Muy buenas mi duda es referente a que estoy con este codigo y no consigo actualizar datos, se como añadir y como borrarlos, pero no actualizar ne mi caso no necesito ni borrar la tupla ycrear uno nuevo, necesito actualizar la tupla en cuestion solamente, lo intentando hacer con este codigo pero claro el .add no vale de nada pq eso seria para añadir la una tupla nueva, y yo necesito solamente cambiar unos cuantos datos de esa tupla y listo.

    Estoy en el controlador AdminController como podeis ver y este es

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using blogmvc.Models;
    
    namespace blogmvc.Controllers
    {
        public class AdminController : Controller
        {
            private ApplicationDbContext db = new ApplicationDbContext();
            //opcion que veo interesante es la lista UserCanRegister ponerla aqui para poder usarla en el EditOption
            //List<SelectListItem> UserCanRegister { get; set; }
            // GET: Admin
            [Authorize]
            public ActionResult Index()
            {
                //comprobar el usuario que accede a la parte de administracion 
                
                return View();
            }
            //GET UserProfile
            [Authorize]
            public ActionResult UserProfile()
            {
    
                string userName = User.Identity.Name;
                //consulta LINSQ to SQL
    
                //el List para rellenar el dropdownlist 
                List<SelectListItem> UserCanRegister = new List<SelectListItem>()
                {
                    new SelectListItem {Text = "No", Value = "0", Selected = true },
                    new SelectListItem {Text = "Yes", Value = "1" }
                };
                ViewBag.UserCanRegister = UserCanRegister;
                //ViewData["DropDownListUsers"] = UserCanRegister;
                List<Option> Options = new List<Option>();
                Options = db.Option.ToList();
                Option Option = new Option();
                Option.siteurl = "";
                Option.home = "";
                Option.blogname = "";
                Option.blogdescription = "";
                Option.user_can_register = "No";
                Option.admin_email = "";
                Option.ApplicationUserID = "";
                
                if (Options.Count == 1)
                {
                    //proceder a mostrar o que haya insertado 
                    //mostrar la tupla que pertenezca a ese usuario 
                    //necesito saber el id que tiene el username asociado desde la propia tabla Users 
                    List<ApplicationUser> Users = db.Users.ToList();
                    //usuario logueado en el sistema 
                    var User = Users.Find(user => user.UserName == userName);
                    //busca el usuario donde user.id es el que esta lgoueado en el sistema
                    var usuario = Options.Where(user => user.ApplicationUserID == User.Id);
                    Option = usuario.ElementAt(0);
                }
                ViewBag.Option = Option;
                //ViewData["Option"] = Options;
                return View("User");
                 
                
            }
            
            [HttpPost]
            [ValidateAntiForgeryToken]
            public ActionResult EditOption(Option Option)
            {
                string userName = User.Identity.Name;
                //consulta LINSQ to SQL
                
                List<SelectListItem> UserCanRegister = new List<SelectListItem>()
                {
                    new SelectListItem {Text = "No", Value = "0" },
                    new SelectListItem {Text = "Yes", Value = "1" }
                };
                ViewBag.UserCanRegister = UserCanRegister;
                string userCanRegister = Request.Form["UserCanRegister"].ToString();
                if (userCanRegister == "0")
                {
                    Option.user_can_register = "No";
                }
                else if (userCanRegister == "1")
                {
                    Option.user_can_register = "Yes";
                }
    
                /*var query = from op in db.Option
                            select op; */
                List<ApplicationUser> AppUser = db.Users.ToList();
                List<Option> ListOption = db.Option.ToList();
                //estas variables sderan nulas si no hay tuplas
                var UserName = AppUser.Where(user => user.UserName == userName).SingleOrDefault();
                var optionUser = ListOption.Where(option => option.ApplicationUserID == UserName.Id);
                Option Options = new Option();
    
                if (optionUser.Count() == 0)
                {
                    //aqui se debe proceder al insertado de los datos que haya en el formulario
                    db.Option.Add(new Option {
                        siteurl = Option.siteurl,
                        home = Option.home,
                        blogname = Option.blogname,
                        blogdescription = Option.blogdescription,
                        post_per_page = Option.post_per_page,
                        user_can_register = Option.user_can_register,
                        admin_email = Option.admin_email,
                        ApplicationUserID = UserName.Id
                    });
    
                }
                if (optionUser.Count() == 1)
                {
                    //aqui lo que tenemos que hacer es un where que devuelva las opciones que pertenecen al usuario y modificarlas
                    var userOption = db.Option.Where(option => option.ApplicationUserID == UserName.Id).Single();
                    userOption.OptionID = Option.OptionID;
                    userOption.siteurl = Option.siteurl;
                    userOption.home = Option.home;
                    userOption.blogname = Option.blogname;
                    userOption.blogdescription = Option.blogdescription;
                    userOption.post_per_page = Option.post_per_page;
                    userOption.user_can_register = Option.user_can_register;
                    userOption.admin_email = Option.admin_email;
                    userOption.ApplicationUserID = UserName.Id;
                    db.Option.Attach(userOption);
                }
                else if (optionUser.Count() > 1) 
                {
                    var optionsusers = db.Option.Where(option => option.ApplicationUserID == UserName.Id);
                    List<Option> OptionsUser = optionsusers.ToList();
                    int userCount = OptionsUser.Count();
                    for (int i = 0; i < userCount; i++)
                    {
                        var optionUsers1 = db.Option.ElementAt(i);
                        db.Option.Remove(optionUsers1);
                    }
                    db.Option.Add(new Option
                    {
                        siteurl = Option.siteurl,
                        home = Option.home,
                        blogname = Option.blogname,
                        blogdescription = Option.blogdescription,
                        post_per_page = Option.post_per_page,
                        user_can_register = Option.user_can_register,
                        admin_email = Option.admin_email,
                        ApplicationUserID = UserName.Id
                    });
                }
    
    
                /* Un usuario solo tendra una lista de opciones disponible, por tanto tengo que controlar que cuando un usuario añada las opciones desde el formulario
                 * lo que hay que hacer es si ese usuario tiene una lista de opciones ya configurada, modificar esa lista de opciones si no tiene se añade una lista de 
                 * opciones desde el formulario.
                 */
                db.SaveChanges();
    
    
                //List<Option> Loption = new List<Option>();
                //vamos a comprobar que no haya tuplas en la tabla y si la hay tuplas se realizara una actualización de la tupla
                /*
                if (optionUser != null)
                {
                    Loption.Add(optionUser);
                    var optionUser1 = Loption.Where(option => option.ApplicationUserID == UserName.Id);
                    
                }
                else
                {
    
                }
                */
                
                
                //db.Option.Add(optionUser);
                /*
                {
                    new Option { OptionID = 1, siteurl = Option.siteurl, home = Option.home, blogname = Option.blogname, blogdescription = Option.blogdescription,
                        post_per_page = Option.post_per_page, user_can_register = Option.user_can_register, admin_email = Option.admin_email, ApplicationUserID = Option.ApplicationUserID} 
                };*/
                //antes de añadir tengo que borrar el contenido de las tuplas
                //db.Option.Remove(db.Option.First());
    
                //Loption.ForEach(s => db.Option.Add(s));
                //db.SaveChanges();
                return View("User");
            }
    
        }
    }

    Aqui esta el codigo completo y en mi codigo de github os el unico cambvio que hay con respecto al codigo anterior es que pone @model Option y no consigo tampoco que me muestre los datos del objeto Option en el metodo UserProfile().

    El metodo EditOption es el que intento si os fijais cambiar los datos o insertar los datos y tb asegurarme de que no hay 2 tuplas donde se repiten las UserID que hacen de FK en la base de datos, ¿como actualizo los datos? y ¿coimo muestro los datos bien?

    viernes, 2 de septiembre de 2016 9:51

Todas las respuestas

  • hola

    entiendo que si estas dentro del context al aplicar un cambio no necesitas realziar el attach ya que la entidad aun es trackeada pot EF

    Add/Attach and Entity States

    ahora si la quitas completo del tracking ahi si deberias asignar el state

    context.Entry(existingEntity).State = EntityState.Modified;

    lo que si recomendaria es que el contexto de EF lo uses dentro de un bloque "using"

    tampoco esta bueno que un solo action realice todas las operaciones, quizas si vas a a insertar invocar un action, si vas a actualizar usar otro distinto

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 2 de septiembre de 2016 11:42
  • bueno y otro problema que tengo aqui mismo es que si te das cuenta en el metodo UserProfile() intento llevarme la tupla y mostrarla en el formulario si es que hay tupla que mostrar por eso lo del if ahi en medio que te muestro aqui

       if (Options.Count == 1)
                {
                    //proceder a mostrar o que haya insertado 
                    //mostrar la tupla que pertenezca a ese usuario 
                    //necesito saber el id que tiene el username asociado desde la propia tabla Users 
                    List<ApplicationUser> Users = db.Users.ToList();
                    //usuario logueado en el sistema 
                    var User = Users.Find(user => user.UserName == userName);
                    //busca el usuario donde user.id es el que esta lgoueado en el sistema
                    var usuario = Options.Where(user => user.ApplicationUserID == User.Id);
                    Option = usuario.ElementAt(0);
                }
                ViewBag.Option = Option;
                //ViewData["Option"] = Options;
                return View("User");

    No se muestra la tupla en el formulario y estoy usando un ViewBag y no entiendo porque, saludos.

    viernes, 2 de septiembre de 2016 15:21
  • mira me he leido eso de actualizar los datos que es realmente lo que necesito y no funciona de ninguna manera, si pudieras probar el codigo te lo agradeceria porque no tira de ninguna manera y claro lo que necesito realmente es modificar la tupla los datos que el usuario ponga en el formulario y listo.

    bueno te vuelvo a pegar el codigo para que lo veas mas limpio y he probado de esa manera y no tira, realmente fijate en 

     if (optionUser.Count() == 1) 

    ahi es donde hay que fijarse pq es realmente lo que necesito hacer y no me actualiza los datos en la base de datos a saber porque aqui tienes todo el codigo limpio y a ver is sacas donde esta el error, porque estoy harto de probar y no sacarlo.

    public class AdminController : Controller
        {
            private ApplicationDbContext db = new ApplicationDbContext();
            //opcion que veo interesante es la lista UserCanRegister ponerla aqui para poder usarla en el EditOption
            //List<SelectListItem> UserCanRegister { get; set; }
            // GET: Admin
            [Authorize]
            public ActionResult Index()
            {
                //comprobar el usuario que accede a la parte de administracion
                return View();
            }
            //GET UserProfile
            [Authorize]
            public ActionResult UserProfile()
            {
    
                string userName = User.Identity.Name;
                //consulta LINSQ to SQL, el List para rellenar el dropdownlist.
                List<SelectListItem> UserCanRegister = new List<SelectListItem>()
                {
                    new SelectListItem {Text = "No", Value = "0", Selected = true },
                    new SelectListItem {Text = "Yes", Value = "1" }
                };
                ViewBag.UserCanRegister = UserCanRegister;
                //ViewData["DropDownListUsers"] = UserCanRegister;
                List<Option> Options = new List<Option>();
                Options = db.Option.ToList();
                Option Option = new Option();
                Option.siteurl = "";
                Option.home = "";
                Option.blogname = "";
                Option.blogdescription = "";
                Option.user_can_register = "No";
                Option.admin_email = "";
                Option.ApplicationUserID = "";
                
                if (Options.Count == 1)
                {
                    //proceder a mostrar o que haya insertado 
                    //mostrar la tupla que pertenezca a ese usuario 
                    //necesito saber el id que tiene el username asociado desde la propia tabla Users 
                    List<ApplicationUser> Users = db.Users.ToList();
                    //usuario logueado en el sistema 
                    var User = Users.Find(user => user.UserName == userName);
                    //busca el usuario donde user.id es el que esta lgoueado en el sistema
                    var usuario = Options.Where(user => user.ApplicationUserID == User.Id);
                    Option = usuario.ElementAt(0);
                }
                ViewBag.Option = Option;
                //ViewData["Option"] = Options;
                return View("User", Option);    
            }
            [HttpPost]
            [ValidateAntiForgeryToken]
            public ActionResult EditOption(Option Option)
            {
                string userName = User.Identity.Name;
                //consulta LINSQ to SQL
                
                List<SelectListItem> UserCanRegister = new List<SelectListItem>()
                {
                    new SelectListItem {Text = "No", Value = "0" },
                    new SelectListItem {Text = "Yes", Value = "1" }
                };
                ViewBag.UserCanRegister = UserCanRegister;
                string userCanRegister = Request.Form["UserCanRegister"].ToString();
                if (userCanRegister == "0")
                {
                    Option.user_can_register = "No";
                }
                else if (userCanRegister == "1")
                {
                    Option.user_can_register = "Yes";
                }
    
                /*var query = from op in db.Option
                            select op; */
                List<ApplicationUser> AppUser = db.Users.ToList();
                List<Option> ListOption = db.Option.ToList();
                //estas variables sderan nulas si no hay tuplas
                var UserName = AppUser.Where(user => user.UserName == userName).SingleOrDefault();
                var optionUser = ListOption.Where(option => option.ApplicationUserID == UserName.Id);
                Option Options = new Option();
    
                if (optionUser.Count() == 0)
                {
                    //aqui se debe proceder al insertado de los datos que haya en el formulario
                    db.Option.Add(new Option {
                        siteurl = Option.siteurl,
                        home = Option.home,
                        blogname = Option.blogname,
                        blogdescription = Option.blogdescription,
                        post_per_page = Option.post_per_page,
                        user_can_register = Option.user_can_register,
                        admin_email = Option.admin_email,
                        ApplicationUserID = UserName.Id
                    });
                    db.SaveChanges();
    
                }
                if (optionUser.Count() == 1)
                {
                    //using (ApplicationDbContext db = new ApplicationDbContext())
                    //{ aqui tambien he usado con el using y tampoco ha funcionado.
    
                    var userOption = db.Option.Where(option => option.ApplicationUserID == UserName.Id).Single();
                    //userOption.OptionID = Option.OptionID;
                    userOption.siteurl = Option.siteurl;
                    userOption.home = Option.home;
                    userOption.blogname = Option.blogname;
                    userOption.blogdescription = Option.blogdescription;
                    userOption.post_per_page = Option.post_per_page;
                    userOption.user_can_register = Option.user_can_register;
                    userOption.admin_email = Option.admin_email;
                    userOption.ApplicationUserID = UserName.Id;
                    db.Entry(userOption).State = EntityState.Modified;
                    db.Option.Attach(userOption);
                    db.SaveChanges();
                    //}
                    
                }
                else if (optionUser.Count() > 1) 
                {
                    var optionsusers = db.Option.Where(option => option.ApplicationUserID == UserName.Id);
                    List<Option> OptionsUser = optionsusers.ToList();
                    int userCount = OptionsUser.Count();
                    for (int i = 0; i < userCount; i++)
                    {
                        var optionUsers1 = db.Option.ElementAt(i);
                        db.Option.Remove(optionUsers1);
                    }
                    db.Option.Add(new Option
                    {
                        siteurl = Option.siteurl,
                        home = Option.home,
                        blogname = Option.blogname,
                        blogdescription = Option.blogdescription,
                        post_per_page = Option.post_per_page,
                        user_can_register = Option.user_can_register,
                        admin_email = Option.admin_email,
                        ApplicationUserID = UserName.Id
                    });
                    db.SaveChanges();
                }
                return View("User");
            }

    viernes, 2 de septiembre de 2016 22:10