/// <summary> /// Transforms a business logic layer <see cref="ValidationErrorsDictionary"/> to the web controller's <see cref="ModelStateDictionary"/> /// </summary> public static ModelStateDictionary ToModelState(ValidationErrorsDictionary validationErrors) { var result = new ModelStateDictionary(); foreach (var(key, errors) in validationErrors.AllErrors) { foreach (var error in errors) { result.AddModelError(key, error); } } return(result); }
/// <summary> /// If some 2 or more entities have the same Id that isn't 0, an appropriate error is added to the <see cref="ValidationErrorsDictionary"/> /// </summary> public static void ValidateUniqueIds <TEntity>(List <TEntity> entities, ValidationErrorsDictionary modelState, IStringLocalizer localizer) where TEntity : EntityWithKey { if (entities is null) { throw new ArgumentNullException(nameof(entities)); } if (modelState is null) { throw new ArgumentNullException(nameof(modelState)); } if (localizer is null) { throw new ArgumentNullException(nameof(localizer)); } // Check that Ids are unique var duplicateIds = entities.Where(e => !(e.GetId()?.Equals(0) ?? true)) // takes away the nulls too .GroupBy(e => e.GetId()) .Where(g => g.Count() > 1); if (duplicateIds.Any()) { // Hash the entities' indices for performance Dictionary <TEntity, int> indices = entities.ToIndexDictionary(); foreach (var groupWithDuplicateIds in duplicateIds) { foreach (var entity in groupWithDuplicateIds) { // This error indicates a bug var index = indices[entity]; modelState.AddModelError($"[{index}].Id", localizer["Error_TheEntityWithId0IsSpecifiedMoreThanOnce", entity.GetId()]); } } } }