首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取导致ValidationAttribute的DbEntityValidationException类型

获取导致ValidationAttribute的DbEntityValidationException类型
EN

Stack Overflow用户
提问于 2016-02-12 14:03:38
回答 2查看 780关注 0票数 4

我使用的是依赖于System.ComponentModel.DataAnnotations.ValidationAttribute的实体框架的验证,所以当我调用DbContext.SaveChanges()而实体属性验证失败时,就会抛出一个DbEntityValidationException

我需要知道的是,究竟是哪个ValidationAttribute导致了验证错误。我需要知道在我的程序中导致ValidationAttribute DbEntityValidationException of .

我已经知道如何迭代DbEntityValidationException中的验证错误集合。然而,所需的信息不在其中。

示例

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

代码语言:javascript
复制
class Model
{
    [Required]
    [MaxLength(3)]
    string Code { ... }
}

...and希望添加一个新实例,如下所示:

代码语言:javascript
复制
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()需要做什么才能知道RequiredMaxLength注释是否触发了验证错误?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-12 14:35:14

我认为您需要的是Validator.TryValidateObject静态方法:

代码语言:javascript
复制
var modelToSave = new Model { Code = "ThisIsTooLong" };
var results = new List<ValidationResult>();
bool isValid=Validator.TryValidateObject( modelToSave, context, results, true);

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

更新

一个使用ValidationAttribute的通用解决方案可以这样做:

代码语言:javascript
复制
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;
} 
票数 1
EN

Stack Overflow用户

发布于 2016-02-12 15:07:34

如果您正在使用实体框架4.1+,这可能会对您有所帮助。您可以在实体中实现自己的验证逻辑,并为不同的验证问题返回自己的错误代码。

IValidatableObject是一个驻留在System.ComponentModel.DataAnnotations中的接口。虽然它不是实体框架API的一部分,但您仍然可以利用它在实体框架类中进行服务器端验证。IValidatableObject提供了实体框架在SaveChanges期间调用的验证方法,或者您可以在任何需要验证类的时候调用自己。 像Required和MaxLength这样的配置在单个字段上执行验证。在验证方法中,可以有更复杂的逻辑,例如,比较两个字段。

代码语言:javascript
复制
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” });
            }
        }
    }

实体框架验证

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35364514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档