EF 代码优先:IValidatable 对象未验证

Posted

技术标签:

【中文标题】EF 代码优先:IValidatable 对象未验证【英文标题】:EF Code First: IValidatable Object not validating 【发布时间】:2011-02-27 09:04:07 【问题描述】:

我在一个使用 EF Code First 并实现 IValidatableObject 的简单测试场景中有一个对象。有一些非常简单的逻辑可以添加验证错误并将其返回。该对象还有其他验证。

然而,当保存对象时——基于属性的验证工作——IValidatableObject 接口似乎永远不会触发。调试器不会介入,调用 SaveChanges() 或 GetValidationErrors() 时不会出现错误。

public class Customer : IValidatableObject 
[Key]
public int Id  get; set; 

[StringLength(50)]
[DisplayName("First Name")]

public string FirstName  get; set; 

[Required]
[DisplayName("Last Name")]
[StringLength(50)]
public string LastName  get; set; 

[Required]
[StringLength(100)]
public string Company  get; set; 

[StringLength(200)]
public string Email  get; set; 

[DisplayName("Credit Limit")]
public decimal CreditLimit  get; set; 

[DisplayName("Entered On")]
public DateTime? Entered  get; set; 


public virtual ICollection<Address> Addresses  get; set;  


public Customer()

    Entered = DateTime.Now;
    CreditLimit = 1000.00M;

    Addresses = new List<Address>();


public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)

    var results = new List<ValidationResult>();

    // add an error ALWAYS for testing - it doesn't show up
    // and the debugger never hits this code
    results.Add(new ValidationResult("Validate Added message",new []  "Company" ));

    return results;

当我现在尝试添加客户并检查验证错误时:

public void AddNewCustomer()

    Customer customer = new Customer();  

    context.Customers.Add(customer);

    customer.LastName = "Strahl";
    customer.FirstName = "Rick";
    customer.Entered = DateTime.Now;
    //customer.Company = "West Wind"; // missing causes val error

    var errorEntries = context.GetValidationErrors();

我收到了公司的一个验证错误,但 IValidatableObject 没有任何结果应该总是失败。

知道为什么吗?

【问题讨论】:

【参考方案1】:

引用Jeff Handley's Blog Post on Validation Objects and Properties with Validator:

在验证对象时, 以下过程应用于 Validator.ValidateObject:

    验证属性级属性 如果任何验证器无效,则中止验证并返回 失败 验证对象级属性 如果任何验证器无效,则中止验证并返回 失败 如果在桌面框架和对象上实现 IValidatableObject,然后调用它的 验证方法并返回任何 失败

这表明您尝试执行的操作不会开箱即用,因为验证将在第 2 步中止。

【讨论】:

是的,就是这样。如果没有其他验证错误,则会触发 IValidatableObject 代码。虽然对这种行为不满意 - 不向用户显示所有适用的错误是很糟糕的。

以上是关于EF 代码优先:IValidatable 对象未验证的主要内容,如果未能解决你的问题,请参考以下文章

EF 代码优先映射的“状态对象” - 完全隐藏?

EF6:代码优先复杂类型

EF 增删改

我可以将依赖项注入迁移(使用 EF-Core 代码优先迁移)吗?

MVC3 代码优先 - EF4.1 不会自动创建表(使用 MySQL 和 Connector/Net 6.3.6。)

EF 4.1 代码优先关系表