public async Task <ActionResult> AssignEffect(AssignEssentialOilEffectViewModel model,
                                                      IList <AssignValueViewModel> assignValueViewModels)
        {
            var validationResult = new ValidationResultList();

            model.AssignEffects = assignValueViewModels;

            if (ModelState.IsValid)
            {
                try
                {
                    if (assignValueViewModels == null || string.IsNullOrEmpty(model.EssentialOilId))
                    {
                        Log.Error("AssignEffect. An unexpected error occurred. Value is null.");
                        throw new ArgumentNullException("An unexpected error occurred. Value is null.");
                    }

                    // Delete all assigned effects from database in order to update.
                    validationResult =
                        await _essentialOilEffectService.DeleteAssignedEffectsAsync(model.EssentialOilId);

                    // Insert assigned effects if deletion was successful.
                    if (!validationResult.HasErrors)
                    {
                        foreach (var assignValueViewModel in assignValueViewModels)
                        {
                            // Insert the assigned effects in database.
                            validationResult = await AssignEffectToEssentialOil(model, assignValueViewModel);
                        }
                    }
                }
                catch (Exception e)
                {
                    Log.Error($"AssignEffect. An unexpected error occurred while inserting or editing: {e}");
                    throw new ArgumentException(Resources.Resources.Error_UnexpectedError);
                }
            }

            // Show validation result, if validation error occurred while
            // inserting or if ModelState is invalid.
            if (validationResult.HasErrors || !ModelState.IsValid)
            {
                AddValidationResultsToModelStateErrors(validationResult.Errors);

                // Set categories to display in list.
                var categories = await _categoryService.GetAllAsync(new CategoryFilter());

                model.Categories = categories;

                Log.Info("Show AssignEffect");
                return(View(nameof(AssignEffect), model));
            }

            Log.Info("Redirect to Index");
            return(RedirectToAction(nameof(Index), new { lastEditedEssentialOilId = model.EssentialOilId }));
        }
        /// <summary>
        ///     Gets the AssignEssentialOilEffectViewModel.
        /// </summary>
        /// <author>Anna Krebs</author>
        /// <param name="id"></param>
        /// <returns></returns>
        private async Task <AssignEssentialOilEffectViewModel> GetEssentialOilEffectViewModel(string id)
        {
            var essentialOil = await _essentialOilService.GetByIdAsync(id);

            if (essentialOil == null)
            {
                Log.Error($"An unexpected error occurred while getting id. No entity with id {id} could be found.");
                throw new ArgumentNullException(string.Format(Resources.Resources.Error_NoEntityWithIdFound, id));
            }

            // Get values from database.
            var effects = await _effectService.GetAllAsync(new EffectFilter());

            var categories = await _categoryService.GetAllAsync(new CategoryFilter());

            var essentialOilEffects =
                await _essentialOilEffectService.GetAllAsync(new EssentialOilEffectFilter { EssentialOilId = id });

            IList <AssignValueViewModel> assignValueViewModels = new List <AssignValueViewModel>();

            // Create list of effects for view.
            foreach (var effect in effects)
            {
                var assignValueViewModel = new AssignValueViewModel(null, effect, null);

                foreach (var essentialOilEffect in essentialOilEffects)
                {
                    // Map values from database to model.
                    if (assignValueViewModel.AssignedValueId == essentialOilEffect.EffectId)
                    {
                        assignValueViewModel.EffectDegree = essentialOilEffect.EffectDegree;
                    }
                }

                assignValueViewModels.Add(assignValueViewModel);
            }

            var model = new AssignEssentialOilEffectViewModel(essentialOil, null, assignValueViewModels, categories);

            Log.Info($"Get AssignEssentialOilEffectViewModel for essential oil with id {id}");
            return(model);
        }
        /// <summary>
        ///     Inserts all assigned effects for essential oil in database.
        /// </summary>
        /// <author>Anna Krebs</author>
        /// <param name="model"></param>
        /// <param name="assignValueViewModel"></param>
        /// <returns></returns>
        private async Task <ValidationResultList> AssignEffectToEssentialOil(AssignEssentialOilEffectViewModel model,
                                                                             AssignValueViewModel assignValueViewModel)
        {
            var validationResult = new ValidationResultList();

            // Only assign, if EffectDegree was assigned.
            if (assignValueViewModel.EffectDegree > 0)
            {
                var essentialOilEffect = new EssentialOilEffect();

                // Map view model to entity.
                essentialOilEffect.EssentialOilId = model.EssentialOilId;
                essentialOilEffect.EffectId       = assignValueViewModel.AssignedValueId;
                essentialOilEffect.EffectDegree   = assignValueViewModel.EffectDegree;

                validationResult = await _essentialOilEffectService.InsertAsync(essentialOilEffect);

                Log.Info(
                    $"Assign effect with id {assignValueViewModel.AssignedValueId} to essential oil with id {model.EssentialOilId}");
            }

            return(validationResult);
        }