/// <summary> /// Validate the changeset. /// </summary> /// <param name="validationContext">The ValidationContext to use.</param> /// <returns>True if the changeset is valid, false otherwise.</returns> internal bool Validate(ValidationContext validationContext) { bool success = true; foreach (Entity entity in this) { entity.VerifyNotEditing(); bool entityRequiresValidation = entity.MetaType.RequiresValidation; EntityAction customMethod = entity.EntityActions.SingleOrDefault(); if (!entityRequiresValidation && customMethod == null) { continue; } if (entity.EntityState == EntityState.Deleted) { // skip validation for Deleted entities here since the entity is going to be deleted anyway continue; } // first validate the entity List <ValidationResult> validationResults = new List <ValidationResult>(); if (entityRequiresValidation) { ValidationUtilities.TryValidateObject(entity, validationContext, validationResults); } // validate any Custom Method invocations if (customMethod != null) { // validate the method call object[] parameters = customMethod.HasParameters ? customMethod.Parameters.ToArray() : null; ValidationContext customMethodValidationContext = ValidationUtilities.CreateValidationContext(entity, validationContext); ValidationUtilities.TryValidateCustomUpdateMethodCall(customMethod.Name, customMethodValidationContext, parameters, validationResults); } if (validationResults.Count > 0) { // replace the validation errors for the entity IEnumerable <ValidationResult> entityErrors = new ReadOnlyCollection <ValidationResult>(validationResults.Select(err => new ValidationResult(err.ErrorMessage, err.MemberNames)).Distinct(new ValidationResultEqualityComparer()).ToList()); ValidationUtilities.ApplyValidationErrors(entity, entityErrors); success = false; } else { // clear the errors for the entity entity.ValidationErrors.Clear(); } } return(success); }
/// <summary> /// Get the <see cref="ValidationContext"/> to be used for validation invoked /// from this <see cref="ComplexObject"/>. /// </summary> /// <returns> /// A new <see cref="ValidationContext"/> instance, using the /// <see cref="EntityContainer.ValidationContext"/> as the parent context /// if available. /// </returns> private ValidationContext CreateValidationContext() { // Get the validation context from the entity container if available, // otherwise create a new context. ValidationContext parentContext = null; Entity rootEntity = this.Entity; if (rootEntity != null && rootEntity.EntitySet != null && rootEntity.EntitySet.EntityContainer != null) { parentContext = rootEntity.EntitySet.EntityContainer.ValidationContext; } return(ValidationUtilities.CreateValidationContext(this, parentContext)); }