public ActionResult Create(UserTypeRating usertyperating)
 {
     if (ModelState.IsValid) {
         usertyperatingRepository.InsertOrUpdate(usertyperating);
         usertyperatingRepository.Save();
         return RedirectToAction("Index");
     } else {
         ViewBag.PossibleUser = userRepository.All;
         ViewBag.PossibleTypeRating = typeratingRepository.All;
         return View();
     }
 }
        public ActionResult UserEdit(UserEditModel viewModel)
        {
            User user = userRepository.Find(UserContext.GetCurrent().ID);
            user.InjectFrom<NotNullValueInjection>(viewModel);
            viewModel.Rank = user.Rank;

            if (!ValidateNumberOfTyperatingsInternal(viewModel.TypeRatingIDs.Count(), user)) {

                // TODO loc
                ModelState.AddModelError("TypeRatingIDs", "No way");
            }

            HashSet<int> notReleaseableRatingIDs = new HashSet<int>(userTypeRatingRepository.All.Where(t => t.UserID == user.ID && t.ValidTo == null).ToList().Where(t => !t.CanBeReleased()).Select(t => t.TypeRatingID));
            HashSet<int> currentRatingIDsSelected = new HashSet<int>(viewModel.TypeRatingIDs.Select(t => int.Parse(t)));

            if (!notReleaseableRatingIDs.IsSubsetOf(currentRatingIDsSelected)) {
                throw new NotSupportedException("You cannot release type ratings that you don't hold for at least 50 days.");
            }

            if (ModelState.IsValid) {

                userRepository.InsertOrUpdate(user);
                userRepository.Save();

                var currentUserTypeRatings = userTypeRatingRepository.All.Where(t => t.UserID == user.ID && t.ValidTo == null).ToList();

                foreach (var rating in currentUserTypeRatings) {
                    if (!viewModel.TypeRatingIDs.Contains(rating.TypeRatingID.ToString())) {
                        UserTypeRating toChange = userTypeRatingRepository.Find(rating.ID);
                        toChange.ValidTo = DateTime.UtcNow;
                        userTypeRatingRepository.InsertOrUpdate(toChange);
                    }
                }

                foreach (string rating in viewModel.TypeRatingIDs) {
                    if (!currentUserTypeRatings.Any(t => t.TypeRatingID.ToString() == rating)) {
                        UserTypeRating newRating = new UserTypeRating();
                        newRating.TypeRatingID = int.Parse(rating);
                        newRating.UserID = user.ID;
                        newRating.ValidFrom = DateTime.UtcNow;
                        userTypeRatingRepository.InsertOrUpdate(newRating);
                    }
                }

                userTypeRatingRepository.Save();

                return RedirectToAction("UserEdit", new { id = user.ID });
            } else {

                SetupViewModel(viewModel);
                return View(viewModel);
            }
        }
 public void InsertOrUpdate(UserTypeRating usertyperating)
 {
     if (usertyperating.ID == default(int)) {
         // New entity
         context.UserTypeRating.Add(usertyperating);
     } else {
         // Existing entity
         context.UserTypeRating.Attach(usertyperating);
         context.Entry(usertyperating).State = EntityState.Modified;
     }
 }