我们也遇到了这个问题。但是,我们使用的是自定义版本Delta<T>
(主要基于 OData)。
核心问题(除了[NonValidatingParameterBinding]
)是实体是隐藏的(在后面delta.GetEntity()
),因此不会被验证。此外,我们只想验证更改的属性。
我们通过将IValidateObject
接口添加到我们的自定义Delta
类来解决这个问题,签名如下:
[NonValidatingParameterBinding]
public class Delta<TEntityType> : DynamicObject, IDelta, IValidatableObject
where TEntityType : class
这也可以在继承自 OData 的类中完成Delta<T>
,但这不是我们尝试过的。
接口的实现如下所示:
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
var entity = this.GetEntity();
var innerValidationContext = new ValidationContext(entity);
List<ValidationResult> validationResults = new List<ValidationResult>();
foreach (var propertyName in this.GetChangedPropertyNames())
{
innerValidationContext.MemberName = propertyName;
Validator.TryValidateProperty(EntityType.GetProperty(propertyName).GetValue(entity), innerValidationContext, validationResults);
}
return validationResults;
}
希望这可以帮助!/胜利者