private static ValidationMessageCollection OnUpdateFailedFunc(IRepository repository, DbUpdateConcurrencyException dbUpdateEx, DepartmentUpdate.CommandModel commandModel, ref byte[] rowVersion)
        {
            var validationMessages = new ValidationMessageCollection();

            var entry = dbUpdateEx.Entries.Single();
            var databaseEntry = entry.GetDatabaseValues();
            if (databaseEntry == null)
            {
                validationMessages.Add(string.Empty, "Unable to save changes. The department was deleted by another user.");
                return validationMessages;
            }

            var databaseValues = (Department)databaseEntry.ToObject();
            rowVersion = databaseValues.RowVersion;

            if (databaseValues.Name != commandModel.Name)
                validationMessages.Add(nameof(commandModel.Name), "Current value: " + databaseValues.Name);

            if (databaseValues.Budget != commandModel.Budget)
                validationMessages.Add(nameof(commandModel.Budget), "Current value: " + string.Format("{0:c}", databaseValues.Budget));

            if (databaseValues.StartDate != commandModel.StartDate)
                validationMessages.Add(nameof(commandModel.StartDate), "Current value: " + string.Format("{0:d}", databaseValues.StartDate));

            if (databaseValues.InstructorID != commandModel.InstructorID)
                validationMessages.Add(nameof(commandModel.InstructorID), "Current value: " + repository.GetEntity<Instructor>(p => p.ID == databaseValues.InstructorID.Value).FullName);

            validationMessages.Add(string.Empty, "The record you attempted to edit "
                + "was modified by another user after you got the original value. The "
                + "edit operation was canceled and the current values in the database "
                + "have been displayed. If you still want to edit this record, click "
                + "the Save button again. Otherwise click the Back to List hyperlink.");

            return validationMessages;
        }
示例#2
0
        /// <summary>
        /// Validates the specified property name.
        /// </summary>
        /// <param name="propertyName">Name of the property.</param>
        /// <param name="value">The value.</param>
        /// <param name="validationContext">The validation context.</param>
        /// <returns>
        /// The list of validation messages.
        /// </returns>
        public override ValidationMessageCollection Validate(string propertyName, object value, string validationContext)
        {
            ValidationMessageCollection messages = base.Validate(propertyName, value, validationContext);

            if (propertyName == nameof(this.Price) &&
                value is decimal)
            {
                if ((decimal)value != this.Items.Sum(x => x.Price))
                {
                    messages.Add(new ValidationMessage("MustEqualSum", "The order price must match the sum of the item prices.", Array.Empty <object>(), this, propertyName));
                }
            }

            return(messages);
        }
示例#3
0
        public static ValidationMessageCollection Save(
            this IRepository repository,
            EntityStateWrapperContainer entityContainer,
            Func <DbUpdateConcurrencyException, ValidationMessageCollection> dbUpdateConcurrencyExceptionFunc = null,
            Func <RetryLimitExceededException, ValidationMessageCollection> retryLimitExceededExceptionFunc   = null)
        {
            try
            {
                entityContainer.UnitsOfWork().ToList().ForEach(uow =>
                {
                    UpdateStates(repository, uow);
                    repository.Save();
                });

                return(new ValidationMessageCollection());
            }
            catch (DbUpdateConcurrencyException dbUpdateEx)
            {
                Logger.Warn(dbUpdateEx, dbUpdateEx.Message);
                if (dbUpdateConcurrencyExceptionFunc != null)
                {
                    return(dbUpdateConcurrencyExceptionFunc(dbUpdateEx));
                }

                var validationDetails = new ValidationMessageCollection();
                validationDetails.Add(new ValidationMessage(string.Empty, dbUpdateEx.ToString()));
                return(validationDetails);
            }
            catch (RetryLimitExceededException rleEx)
            {
                Logger.Error(rleEx, rleEx.Message);

                if (retryLimitExceededExceptionFunc != null)
                {
                    return(retryLimitExceededExceptionFunc(rleEx));
                }

                var validationDetails = new ValidationMessageCollection();
                validationDetails.Add(new ValidationMessage(string.Empty, "Unable to save changes. Try again, and if the problem persists, see your system administrator."));
                return(validationDetails);
            }
            catch (Exception ex)
            {
                Logger.Error(ex, ex.Message);
                throw;
            }
        }
        private static ValidationMessageCollection OnUpdateFailedFunc(IRepository repository, DbUpdateConcurrencyException dbUpdateEx, DepartmentUpdate.CommandModel commandModel, ref byte[] rowVersion)
        {
            var validationMessages = new ValidationMessageCollection();

            var entry         = dbUpdateEx.Entries.Single();
            var databaseEntry = entry.GetDatabaseValues();

            if (databaseEntry == null)
            {
                validationMessages.Add(string.Empty, "Unable to save changes. The department was deleted by another user.");
                return(validationMessages);
            }

            var databaseValues = (Department)databaseEntry.ToObject();

            rowVersion = databaseValues.RowVersion;

            if (databaseValues.Name != commandModel.Name)
            {
                validationMessages.Add(nameof(commandModel.Name), "Current value: " + databaseValues.Name);
            }

            if (databaseValues.Budget != commandModel.Budget)
            {
                validationMessages.Add(nameof(commandModel.Budget), "Current value: " + string.Format("{0:c}", databaseValues.Budget));
            }

            if (databaseValues.StartDate != commandModel.StartDate)
            {
                validationMessages.Add(nameof(commandModel.StartDate), "Current value: " + string.Format("{0:d}", databaseValues.StartDate));
            }

            if (databaseValues.InstructorID != commandModel.InstructorID)
            {
                validationMessages.Add(nameof(commandModel.InstructorID), "Current value: " + repository.GetEntity <Instructor>(p => p.ID == databaseValues.InstructorID.Value).FullName);
            }

            validationMessages.Add(string.Empty, "The record you attempted to edit "
                                   + "was modified by another user after you got the original value. The "
                                   + "edit operation was canceled and the current values in the database "
                                   + "have been displayed. If you still want to edit this record, click "
                                   + "the Save button again. Otherwise click the Back to List hyperlink.");

            return(validationMessages);
        }
            private void ValidateOneAdministratorAssignmentPerInstructor()
            {
                if (Context.CommandModel.InstructorID == null)
                {
                    return;
                }

                var queryRepository     = ResolveService <IQueryRepository>();
                var duplicateDepartment = queryRepository.GetEntity <Department>(
                    p => p.InstructorID == Context.CommandModel.InstructorID.Value,
                    new AsNoTrackingQueryStrategy(),
                    new EagerLoadingQueryStrategy <Department>(p => p.Administrator),
                    false);

                if (duplicateDepartment != null)
                {
                    string errorMessage =
                        $"Instructor {duplicateDepartment.Administrator.FirstMidName} {duplicateDepartment.Administrator.LastName} " +
                        $"is already administrator of the {duplicateDepartment.Name} department.";

                    ValidationMessageCollection.Add(string.Empty, errorMessage);
                }
            }
        public void TestException()
        {
            ValidationMessageCollection messages = new ValidationMessageCollection();
            IValidatable source = new Example();

            messages.Add(new ValidationMessage("messageKey", "defaultMessage: {0}{1}", new string[] { "X", "Y" }, source, "PropertyA", ValidationLevel.Warning, ValidationContext.Default, 5));

            try
            {
                throw new ValidationException(messages);
            }
            catch (ValidationException ex)
            {
                Assert.IsNotNull(ex);
                Assert.AreEqual(1, ex.ValidaitonMessages.Count);
                Assert.AreEqual("defaultMessage: XY", ex.ValidaitonMessages[0].Message);
                Assert.AreEqual(source, ex.ValidaitonMessages[0].ValidationSource);
                Assert.AreEqual("PropertyA", ex.ValidaitonMessages[0].PropertyName);
                Assert.AreEqual(ValidationLevel.Warning, ex.ValidaitonMessages[0].ValidationLevel);
                Assert.AreEqual(5, ex.ValidaitonMessages[0].ValidationPriority);
                Assert.AreEqual(ValidationContext.Default, ex.ValidaitonMessages[0].ValidationContext);
            }
        }
        public void TestValidationMessageCollection()
        {
            var message1 = new ValidationMessage("message1", "Test1 {0}.", new object[] { 5 }, new Example(), "Property1", ValidationLevel.Error, "Validation context 2", 0);
            var message2 = new ValidationMessage("message2", "Test2 {0}.", new object[] { 5 }, new Example(), "Property2", ValidationLevel.Error, "Validation context 2", 0);
            var message3 = new ValidationMessage("message3", "Test3 {0}.", new object[] { 5 }, new Example(), "Property3", ValidationLevel.Error, "Validation context 2", 0);
            var message4 = new ValidationMessage("message4", "Test4 {0}.", new object[] { 5 }, new Example(), "Property4", ValidationLevel.Info, "Validation context 2", 0);
            var message5 = new ValidationMessage("message5", "Test5 {0}.", new object[] { 5 }, message4.ValidationSource, "Property4", ValidationLevel.Warning, "Validation context 2", 0);
            var messages = new ValidationMessageCollection();

            messages.Add(message1);
            messages.Add(message2);
            messages.Add(message3);
            messages.Insert(messages.Count, message4);

            Assert.AreEqual(message1, messages[0]);
            Assert.AreEqual(message2, messages[1]);
            Assert.AreEqual(message3, messages[2]);
            Assert.AreEqual(message4, messages[3]);

            Assert.AreEqual(1, messages[message1.ValidationSource, "Property1", "Validation context 2"].Count);
            Assert.AreEqual(message1, messages[message1.ValidationSource, "Property1", "Validation context 2"][0]);
            Assert.AreEqual(1, messages[message3.ValidationSource, message3.PropertyName, "Validation context 2"].Count);
            Assert.AreEqual(message3, messages[message3.ValidationSource, message3.PropertyName, "Validation context 2"][0]);

            Assert.AreEqual(0, messages[null as IValidatable].Count);
            Assert.AreEqual(0, messages[null as IValidatable, null as string].Count);
            Assert.AreEqual(0, messages[null as IValidatable, "aaa" as string].Count);
            Assert.AreEqual(0, messages[new Example() as IValidatable, null as string].Count);

            Assert.IsFalse(messages.Contains(null));
            Assert.IsTrue(messages.Contains(message3));

            messages.Add(message5);

            Assert.AreEqual(4, messages.Count);
            Assert.AreEqual(message5, messages.Last());

            messages[3] = message4;

            Assert.AreEqual(4, messages.Count);
            Assert.AreEqual(message1, messages[0]);
            Assert.AreEqual(message2, messages[1]);
            Assert.AreEqual(message3, messages[2]);
            Assert.AreEqual(message4, messages[3]);

            var validationSource = new Example();
            var message6         = new ValidationMessage("message1", "Test1 {0}.", new object[] { 7 }, validationSource, "Property1", ValidationLevel.Error, null, 0);
            var message7         = new ValidationMessage("message2", "Test2 {0}.", new object[] { 8 }, validationSource, "Property1", ValidationLevel.Error, null, 0);
            var message8         = new ValidationMessage("message3", "Test3 {0}.", new object[] { 9 }, validationSource, "Property2", ValidationLevel.Error, "Validation context 2", 0);

            messages.Add(message6);
            messages.Add(message7);
            messages.Insert(messages.Count, message8);

            var mergedMessage = messages.Merge(validationSource, "Property1");

            Assert.AreEqual("Test1 7.\r\nTest2 8.", mergedMessage.Message);
            Assert.AreEqual(ValidationLevel.Error, mergedMessage.ValidationLevel);

            MergedValidationMessage.GetMergedMessages = x => string.Join(" * ", x);

            var mergedMessage2 = messages.Merge(validationSource, "Property1");

            Assert.AreEqual("Test1 7. * Test2 8.", mergedMessage2.Message);
            Assert.AreEqual(ValidationLevel.Error, mergedMessage2.ValidationLevel);

            var mergedMessage4 = messages.Merge(validationSource, "Property2");

            Assert.AreEqual("Test3 9.", mergedMessage4.Message);
            Assert.AreEqual(ValidationLevel.Error, mergedMessage4.ValidationLevel);

            var mergedMessage5 = messages.Merge(validationSource);

            Assert.AreEqual("Test1 7. * Test2 8. * Test3 9.", mergedMessage5.Message);
            Assert.AreEqual(ValidationLevel.Error, mergedMessage5.ValidationLevel);

            MergedValidationMessage.GetMergedMessages = null;
        }