Entity framework 实体框架中的多组验证

Entity framework 实体框架中的多组验证,entity-framework,validation,Entity Framework,Validation,我遇到了这个问题,在保存模型时,我应该允许不同的验证集。通常,验证取决于用户希望如何保存数据。例如,如果用户希望将其数据保存为“草稿”,我应该允许某些字段为空。如果不是“草稿”,我应该多加限制 class Form { public int ID { get; set; } [Required("Title is required.")] public string Title { get; set; } [Required("Body is required

我遇到了这个问题,在保存模型时,我应该允许不同的验证集。通常,验证取决于用户希望如何保存数据。例如,如果用户希望将其数据保存为“草稿”,我应该允许某些字段为空。如果不是“草稿”,我应该多加限制

class Form
{
    public int ID { get; set; }

    [Required("Title is required.")]
    public string Title { get; set; }

    [Required("Body is required.")]
    public string Body { get; set; }

    public bool IsDraft { get; set; }
}
在上面的代码中,我希望仅当IsDraft为false时body的验证才有效


如何创建多组验证?或者如何在实体框架中正确创建条件验证?

数据注释不仅用于验证,还用于使代码与数据库同步。即,首先在EF代码中,若删除必填字段,则数据库必须允许在匹配列中插入NULL

因此,您可以采用以下方法:

  • 创建实体模型类,使其具有尽可能低的要求
  • 创建视图/DTO模型类,该类将实现IValidatableObject接口
  • 实现IValidatableObject接口并在那里进行条件验证
  • IValidatableObject接口允许来自System.ComponentModel.DataAnnotations命名空间的Validator()使用您的类,就像通过注释属性进行验证一样

    接口实现应如下所示:

    public class FormDto: IValidatableObject
    
    {
        public int ID { get; set; }
    
    [Required("Title is required.")]
    public string Title { get; set; }
    
    [Required("Body is required.")]
    public string Body { get; set; }
    
    public bool IsDraft { get; set; }
    
    
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if(!IsDraft && string.IsNullOrWhiteSpace(Body)) yield return new ValidationResult("Body is required.", new string [] {"Body"}); 
        if(!IsDraft && string.IsNullOrWhiteSpace(Title)) yield return new ValidationResult("Title is required.", new string [] {"Title"}); 
    }
    }
    
    public static class IValidatableObjectExtensions
    {
        public static void SelfValidate(this IValidatableObject model)
        {
            ValidationContext ctx = new ValidationContext(model);
            Validator.ValidateObject(model, ctx, true);
        }
    }