我正在使用EF 6.2开发WinForms。
我正在尝试用实体框架为我的实体实现自定义验证逻辑。
起初,我成功地覆盖了DbContext中的DbEntityValidationResult ValidateEntity
方法,并且它运行良好。
但现在我有了很多实体,这变得非常混乱,我想直接在实体类中实现自定义验证。
因此,我尝试实现IValidatableObject
接口。以下是一个简单的实体示例:
public class Inspection : IValidatableObject
{
public int Id { get; set; }
[Required(AllowEmptyStrings = false, ErrorMessage = "You must enter a description")]
[StringLength(maximumLength: 15, ErrorMessage = "The description cannot exceed 15 characters")]
public string Description { get; set; }
public DateTime? ActualDate { get; set; }
public DateTime? ValidityDate { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (ActualDate > ValidityDate)
{
ValidationResult result = new ValidationResult("Actual Date connot be > to ValidityDate");
yield return result;
}
}
}
现在我读了很多东西,但不知道我必须在哪里调用实体的Validate
方法,以及我必须在ValidationContext
参数中传递什么值。
我看过的每一个教程都针对MVC场景,所以我想知道是否有可能将其与Winforms一起使用。我可能遗漏了什么,或者这不是Winforms/EF中验证的正确方法。
你能给我一些建议吗?
由于MSDN的文章,我终于找到了解决方案(以及我的错误(:http://msdn.microsoft.com/en-us/data/gg193959.aspx
当我第一次读它时,我在实现接口时错过了一个部分。我忘了定义ValidationResult
类的memberNames
参数。
所以我改了:
ValidationResult result = new ValidationResult("Actual Date connot be > to ValidityDate");
至
ValidationResult result = new ValidationResult("Actual Date connot be > to ValidityDate",
new[] { nameof(ActualDate), nameof(ValidityDate) });
它如预期的那样发挥了作用。
我仍然想知道,如果手动调用接口的Validate
方法,ValidationContext
参数中应该传递什么值,但这是另一个问题。
因此,为了回答我自己的问题:是的,可以将IValidatableObject
与Winforms一起使用。