EF Code First: IValidatable объект не проверяется - PullRequest
11 голосов
/ 27 февраля 2011

У меня есть объект в простом тестовом сценарии, который использует 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 Ответ

11 голосов
/ 27 февраля 2011

Цитата из Публикация в блоге Джеффа Хэндли о проверке объектов и свойств с помощью Validator :

При проверке объекта в Validator применяется следующий процесс: ValidateObject:

  1. Проверка атрибутов уровня свойства
  2. Если какие-либо валидаторы недействительны, прервать валидацию, возвращая сбой (ы)
  3. Проверить атрибуты уровня объекта
  4. Если какие-либо валидаторы недействительны, прервать валидацию, возвращая ошибки (я)
  5. Если на платформе рабочего стола и объект реализует IValidatableObject, затем вызовите его метод Validate и верните любойсбой (ы)

Это указывает на то, что то, что вы пытаетесь сделать, не будет работать "из коробки", потому что проверка будет прервана на шаге # 2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...