/// <summary> /// Validates a single entity. /// Skips validation (returns true) if entity is marked Deleted. /// </summary> /// <param name="entityInfo">contains the entity to validate</param> /// <param name="entityErrors">An EntityError is added to this list for each error found in the entity</param> /// <returns>true if entity is valid, false if invalid.</returns> public bool ValidateEntity(EntityInfo entityInfo, List <EntityError> entityErrors) { if (entityInfo.EntityState == EntityState.Deleted) { return(true); } // Perform validation on the entity, based on DataAnnotations. var entity = entityInfo.Entity; var validationResults = new List <ValidationResult>(); if (!Validator.TryValidateObject(entity, new ValidationContext(entity, null, null), validationResults, true)) { var keyValues = _persistenceManager.GetKeyValues(entityInfo); var entityTypeName = entity.GetType().FullName; foreach (var vr in validationResults) { entityErrors.Add(new EntityError() { EntityTypeName = entityTypeName, ErrorMessage = vr.ErrorMessage, ErrorName = "ValidationError", KeyValues = keyValues, PropertyName = vr.MemberNames.FirstOrDefault() }); } return(false); } return(true); }
/// <summary> /// Validates a single entity. /// Skips validation (returns true) if entity is marked Deleted. /// </summary> /// <param name="entityInfo">contains the entity to validate</param> /// <param name="entityErrors">An EntityError is added to this list for each error found in the entity</param> /// <returns>true if entity is valid, false if invalid.</returns> public bool ValidateEntity(EntityInfo entityInfo, List <EntityError> entityErrors) { if (entityInfo.EntityState == EntityState.Deleted) { return(true); } bool isValid = true; var entity = entityInfo.Entity; var entityType = entity.GetType(); var entityTypeName = entityType.FullName; var sType = _structuralTypeMap[entityTypeName]; var dataProperties = sType.dataProperties; object[] keyValues = null; foreach (var dp in sType.dataProperties) { if (dp.validators == null || dp.validators.Count == 0) { continue; } if (dp.propertyInfo == null) { dp.propertyInfo = entityType.GetProperty(dp.metaDataProperty.NameOnServer); // try converting from camelCase? if (dp.propertyInfo == null) { continue; } } var value = dp.propertyInfo.GetValue(entity, null); foreach (var validator in dp.validators) { var errorMessage = validator.Validate(value); if (errorMessage != null) { if (keyValues == null) { keyValues = _persistenceManager.GetKeyValues(entityInfo); } entityErrors.Add(new EntityError() { EntityTypeName = entityTypeName, ErrorMessage = errorMessage, ErrorName = "ValidationError", KeyValues = keyValues, PropertyName = dp.metaDataProperty.NameOnServer }); isValid = false; } } } return(isValid); }
public SaveResult ToSaveResult() { WasUsed = true; // try to prevent reuse in subsequent SaveChanges if (EntityErrors != null) { return(new SaveResult() { Errors = EntityErrors.Cast <Object>().ToList() }); } else { var entities = SaveMap.SelectMany(kvp => kvp.Value.Where(ei => (ei.EntityState != EntityState.Detached)) .Select(entityInfo => entityInfo.Entity)).ToList(); var deletes = SaveMap.SelectMany(kvp => kvp.Value.Where(ei => (ei.EntityState == EntityState.Deleted || ei.EntityState == EntityState.Detached)) .Select(entityInfo => new EntityKey(entityInfo.Entity, ContextProvider.GetKeyValues(entityInfo)))).ToList(); return(new SaveResult() { Entities = entities, KeyMappings = KeyMappings, DeletedKeys = deletes }); } }