我正在使用依赖于 System.ComponentModel.DataAnnotations.ValidationAttribute
的 Entity Framework 的验证。因此,当我调用 DbContext.SaveChanges()
并且实体属性验证失败时,会抛出 DbEntityValidationException
。
我需要知道的是究竟是哪个 ValidationAttribute
导致了该验证错误。 即我需要知道在我的程序中导致 Type
的 ValidationAttribute
的 DbEntityValidationException
。
我已经知道如何遍历 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/