2011-02-27 6 views
11

Tengo un objeto en un escenario de prueba simple que usa EF Code First e implementa IValidatableObject. Hay una lógica muy simple que agrega un error de validación y la devuelve. También hay otras validaciones en el objeto.Código EF Primero: Objeto IValidatable que no valida

Sin embargo, al guardar el objeto, mientras que las validaciones basadas en atributos funcionan, la interfaz IValidatableObject parece que nunca se dispara. El depurador no entra en él y el error nunca aparece al llamar a SaveChanges() o 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; 
} 

Cuando Ahora trato de agregar un cliente y comprobar si hay errores de validación:

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(); 
} 

consigo uno error de validación para la empresa, pero nada del IValidatableObject que debe fallar SIEMPRE.

¿Alguna idea de por qué?

Respuesta

11

Presupuesto de Jeff Handley's Blog Post on Validation Objects and Properties with Validator:

Al validar un objeto, el siguiente proceso se aplica en Validator.ValidateObject:

    atributos
  1. Validar propiedad de nivel
  2. Si ningún validadores son inválida, cancela la validación devolviendo el falla (s)
  3. Validar el nivel de atributos de objeto
  4. Si validadores no son válidos, para abortar la validación devolver el fallo (s)
  5. Si en el marco de escritorio y el objeto implementa IValidatableObject, a continuación, llamar a su método Validar y devolver cualquier fallo (s)

Esto indica que lo que están tratando de hacer no va a funcionar fuera de la caja, porque la validación abortará en el paso 2 #.

+0

Sí, eso es todo. Si no hay otros errores de validación, el código IValidatableObject se activa. Aunque no estoy contento con este comportamiento, es desafortunado no mostrar a los usuarios TODOS los errores que se aplican. –

+2

@Rick - Estoy de acuerdo. Probablemente sea el caso de una optimización prematura ... –

Cuestiones relacionadas