private void UpdateAlbum(Models.AlbumViewModel viewModel)
        {
            var artist      = this.context.Artists.FirstOrDefault(art => art.Name == viewModel.Artist);
            var recordLabel = this.context.RecordLabels.FirstOrDefault(rl => rl.Name == viewModel.RecordLabel);

            if (artist == null)
            {
                artist      = new Data.Model.Artist();
                artist.Name = viewModel.Artist;
            }

            if (recordLabel == null)
            {
                recordLabel      = new Data.Model.RecordLabel();
                recordLabel.Name = viewModel.RecordLabel;
            }

            var album     = this.context.Albums.FirstOrDefault(a => a.Name == viewModel.AlbumName);
            var mediaType = this.context.MediaTypes.FirstOrDefault(mt => mt.Name == viewModel.MediaType);

            if (mediaType == null)
            {
                mediaType = new Data.Model.MediaType()
                {
                    Name = viewModel.MediaType
                };
            }

            if (album == null)
            {
                album = new Data.Model.Album()
                {
                    Name = viewModel.AlbumName, Stock = viewModel.Stock, Artist = artist, Label = recordLabel
                };
                album.MediaTypes.Add(mediaType);

                this.context.Albums.Add(album);
            }
            else
            {
                album.Label  = recordLabel;
                album.Artist = artist;
                album.Stock  = viewModel.Stock;

                if (!this.context.Albums.Any(a => a.Name == viewModel.AlbumName && a.MediaTypes.Any(mt => mt.Name == mediaType.Name)))
                {
                    album.MediaTypes.Add(mediaType);
                }
            }

            this.context.SaveChanges();
        }
        public ActionResult Create()
        {
            var mediaTypes = this.context.MediaTypes.ToList();

            Dictionary <int, string> mediaTypeItems = new Dictionary <int, string>();

            foreach (var mediaType in mediaTypes)
            {
                mediaTypeItems.Add(mediaType.Id, mediaType.Name);
            }

            Models.AlbumViewModel viewModelItem = new Models.AlbumViewModel()
            {
                MediaTypes = mediaTypeItems
            };

            return(View(viewModelItem));
        }
        public ActionResult Index(string sortOrder, int?page)
        {
            List <Models.AlbumViewModel> viewModel = new List <Models.AlbumViewModel>();
            List <Task> tasks = new List <Task>();

            tasks.Add(Task.Run(() =>
            {
                var albums     = this.context.Albums.Include("Artist").Include("MediaTypes").Include("Label").ToList();
                var mediaTypes = this.context.MediaTypes.ToList();

                Dictionary <int, string> mediaTypeItems = new Dictionary <int, string>();

                foreach (var mediaType in mediaTypes)
                {
                    mediaTypeItems.Add(mediaType.Id, mediaType.Name);
                }

                foreach (var album in albums)
                {
                    foreach (var albumMediaType in album.MediaTypes)
                    {
                        Models.AlbumViewModel viewModelItem = new Models.AlbumViewModel()
                        {
                            Id          = album.Id,
                            AlbumName   = album.Name,
                            Stock       = album.Stock,
                            Artist      = album.Artist.Name,
                            RecordLabel = album.Label.Name,
                            MediaType   = albumMediaType.Name,
                            MediaTypes  = mediaTypeItems
                        };

                        viewModel.Add(viewModelItem);
                    }
                }
            }));

            int pageSize;

            if (!int.TryParse(System.Configuration.ConfigurationManager.AppSettings["PageSize"].ToString(), out pageSize))
            {
                // Default Page Size of 10
                pageSize = 10;
            }

            Task.WaitAll(tasks.ToArray());

            ViewBag.CurrentSort     = sortOrder;
            ViewBag.AlbumSortParam  = string.IsNullOrEmpty(sortOrder) ? "AlbumName_Desc" : string.Empty;
            ViewBag.ArtistSortParam = sortOrder == "Artist_Asc" ? "Artist_Desc" : "Artist_Asc";

            switch (sortOrder)
            {
            case "AlbumName_Desc":
                viewModel = viewModel.OrderByDescending(vm => vm.AlbumName).ToList();
                break;

            case "Artist_Asc":
                viewModel = viewModel.OrderBy(vm => vm.Artist).ToList();

                break;

            case "Artist_Desc":
                viewModel = viewModel.OrderByDescending(vm => vm.Artist).ToList();

                break;

            default:
                viewModel = viewModel.OrderBy(vm => vm.AlbumName).ToList();

                break;
            }

            return(View(viewModel.ToPagedList(page ?? 1, pageSize)));
        }
        public ActionResult Edit(Models.AlbumViewModel viewModel)
        {
            UpdateAlbum(viewModel);

            return(RedirectToAction("Index"));
        }