MVC Persist Collection ViewModel (Update, Delete, Insert)

Posted by Riccardo Bassilichi on Stack Overflow See other posts from Stack Overflow or by Riccardo Bassilichi
Published on 2012-06-29T09:11:21Z Indexed on 2012/06/29 9:15 UTC
Read the original article Hit count: 261

Filed under:
|
|
|
|

In order to create a more elegant solution I'm curios to know your suggestion about a solution to persist a collection.

I've a collection stored on DB. This collection go to a webpage in a viewmodel. When the go back from the webpage to the controller I need to persist the modified collection to the same DB.

The simple solution is to delete the stored collection and recreate all rows. I need a more elegant solution to mix the collections and delete not present record, update similar records ad insert new rows.

this is my Models and ViewModels.

public class CustomerModel
    {
        public virtual string Id { get; set; }
        public virtual string Name { get; set; }

        public virtual IList<PreferredAirportModel> PreferedAirports { get; set; }
    }

    public class AirportModel
    {
        public virtual string Id { get; set; }
        public virtual string AirportName { get; set; }
    }

    public class PreferredAirportModel
    {
        public virtual AirportModel Airport { get; set; }
        public virtual int CheckInMinutes { get; set; }
    }

    // ViewModels
    public class CustomerViewModel
    {
        [Required]
        public virtual string Id { get; set; }
        public virtual string Name { get; set; }

        public virtual IList<PreferredAirporViewtModel> PreferedAirports { get; set; }
    }

    public class PreferredAirporViewtModel
    {
        [Required]
        public virtual string AirportId { get; set; }

        [Required]
        public virtual int CheckInMinutes { get; set; }
    }

And this is the controller with not elegant solution.

public class CustomerController
    {
        public ActionResult Save(string id, CustomerViewModel viewModel)
        {
            var session = SessionFactory.CurrentSession;

            var customer = session.Query<CustomerModel>().SingleOrDefault(el => el.Id == id);

            customer.Name = viewModel.Name;

            // How cai I Merge collections handling delete, update and inserts ?

            var modifiedPreferedAirports = new List<PreferredAirportModel>();
            var modifiedPreferedAirportsVm = new List<PreferredAirporViewtModel>();

            // Update every common Airport
            foreach (var airport in viewModel.PreferedAirports)
            {
                foreach (var custPa in customer.PreferedAirports)
                {
                    if (custPa.Airport.Id == airport.AirportId)
                    {
                        modifiedPreferedAirports.Add(custPa);
                        modifiedPreferedAirportsVm.Add(airport);

                        custPa.CheckInMinutes = airport.CheckInMinutes;
                    }
                }
            }

            // Remove common airports from ViewModel
            modifiedPreferedAirportsVm.ForEach(el => viewModel.PreferedAirports.Remove(el));

            // Remove deleted airports from model
            var toDelete = customer.PreferedAirports.Except(modifiedPreferedAirports);
            toDelete.ForEach(el => customer.PreferedAirports.Remove(el));

            // Add new Airports
            var toAdd = viewModel.PreferedAirports.Select(el => new PreferredAirportModel
                                                                    {
                                                                        Airport =
                                                                            session.Query<AirportModel>().
                                                                            SingleOrDefault(a => a.Id == el.AirportId),
                                                                        CheckInMinutes = el.CheckInMinutes
                                                                    });
            toAdd.ForEach(el => customer.PreferedAirports.Add(el));

            session.Save(customer);

            return View();
        }
    }

My environment is ASP.NET MVC 4, nHibernate, Automapper, SQL Server.

Thank You!!

© Stack Overflow or respective owner

Related posts about sql

Related posts about LINQ