我使用的是依赖于System.ComponentModel.DataAnnotations.ValidationAttribute的实体框架的验证,所以当我调用DbContext.SaveChanges()而实体属性验证失败时,就会抛出一个DbEntityValidationException。
我需要知道的是,究竟是哪个ValidationAttribute导致了验证错误。我需要知道在我的程序中导致ValidationAttribute DbEntityValidationException 的 of .。
我已经知道如何迭代DbEntityValidationException中的验证错误集合。然而,所需的信息不在其中。
示例
假设我有一个有两个数据注释的属性的简单模型.
class Model
{
[Required]
[MaxLength(3)]
string Code { ... }
}...and希望添加一个新实例,如下所示:
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注释是否触发了验证错误?
发布于 2016-02-12 14:35:14
我认为您需要的是Validator.TryValidateObject静态方法:
var modelToSave = new Model { Code = "ThisIsTooLong" };
var results = new List<ValidationResult>();
bool isValid=Validator.TryValidateObject( modelToSave, context, results, true);如果您的实体无效,您将在results列表中保存每个失败的验证。
更新
一个使用ValidationAttribute的通用解决方案可以这样做:
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;
} 发布于 2016-02-12 15:07:34
如果您正在使用实体框架4.1+,这可能会对您有所帮助。您可以在实体中实现自己的验证逻辑,并为不同的验证问题返回自己的错误代码。
IValidatableObject是一个驻留在System.ComponentModel.DataAnnotations中的接口。虽然它不是实体框架API的一部分,但您仍然可以利用它在实体框架类中进行服务器端验证。IValidatableObject提供了实体框架在SaveChanges期间调用的验证方法,或者您可以在任何需要验证类的时候调用自己。 像Required和MaxLength这样的配置在单个字段上执行验证。在验证方法中,可以有更复杂的逻辑,例如,比较两个字段。
public class Blog : IValidatableObject
{
public int Id { get; set; }
[Required]
public string Title { get; set; }
public string BloggerName { get; set; }
public DateTime DateCreated { get; set; }
public virtual ICollection<Post> Posts { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (Title == BloggerName)
{
yield return new ValidationResult
("Blog Title cannot match Blogger Name", new[] { "Title", “BloggerName” });
}
}
}https://stackoverflow.com/questions/35364514
复制相似问题