我正在使用依赖于 System.ComponentModel.DataAnnotations.ValidationAttribute 的 Entity Framework 的验证。因此,当我调用 DbContext.SaveChanges() 并且实体属性验证失败时,会抛出 DbEntityValidationException

我需要知道的是究竟是哪个 ValidationAttribute 导致了该验证错误。 即我需要知道在我的程序中导致 TypeValidationAttributeDbEntityValidationException

我已经知道如何遍历 DbEntityValidationException 中的验证错误集合。但是,所需的信息不在那里。

示例

假设我有一个带有两个数据注释的单个属性的简单模型......

class Model
{
    [Required]
    [MaxLength(3)]
    string Code { ... }
}

...并想像这样添加一个新实例:
try
{
    var model = new Model { Code = "ThisIsTooLong" };
    dbContext.Set<Model>().Add(model);
    dbContext.SaveChanges();
}
catch (DbEntityValidationException e)
{
    Type unsatisfiedValidationAttribute = MagicFunction();
}

在上述情况下,抛出 DbEntityValidationException 并且变量 unsatisfiedValidationAttribute 应等于 typeof(MaxLengthAttribute)
MagicFunction() 需要做什么才能知道是 Required 还是 MaxLength 注释触发了验证错误?

最佳答案

我想你要找的是 Validator.TryValidateObject 静态方法:

var modelToSave = new Model { Code = "ThisIsTooLong" };
var results = new List<ValidationResult>();
bool isValid=Validator.TryValidateObject( modelToSave, context, results, true);

如果您的实体无效,您将在 results 列表中保存每个失败的验证。

更新

好吧,使用 ValidationAttribute 获取 ErrorMessage 的通用解决方案可能是这样做:
public static ValidationAttribute GetAttribute(Type entityType, string property, string errorMessage)
{
   var attributes = typeof(entityType)
                   .GetProperty(property)
                   .GetCustomAttributes(false)
                   .OfType<ValidationAttribute>()
                   .ToArray();
   var attribute= attributes.FirstOrDefault(a => a.ErrorMessage == errorMessage);
   return attribute;
}

关于c# - 获取导致 DbEntityValidationException 的 ValidationAttribute 类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35364514/

10-09 04:22