2012-01-17 6 views
25

Prefiero trabajar con la configuración de API Fluent en la anotación de datos porque quiero separar el modelo del acceso a los datos.¿Cómo hacer que la configuración de la API Fluent funcione con la validación MVC del lado del cliente?

Lo he intentado en MVC, Fluent API no funciona con la validación del lado del cliente. En pocas palabras, ¿hay una manera simple de hacer que la API Fluent funcione con la validación del lado del cliente como lo hace DataAnnotation?

Respuesta

35

No. Fluent API es solo un mapa - correcto. Las anotaciones de datos son mapeo y validación, incorrectas. Las anotaciones de datos son una de las peores características del código EF primero, porque cuando se usan de esta manera combinan la persistencia con la lógica de presentación y validación.

Asesoramiento: no utilice entidades EF para la presentación. Use modelos de vistas especiales con anotaciones de datos y permita que su controlador prepare modelos de vista de entidades y viceversa. Pronto o más tarde encontrará situaciones en las que su validación no es 1: 1 con su mapeo o donde su vista necesita más o menos información que la proporcionada en el tipo de entidad. Use modelos de vista y estas situaciones serán manejadas por ellos.

+0

¿Por qué EF siquiera necesita mapeos como "HasMaxLength"? Si el valor es más largo, SQL Server lo rechazará si se intenta la escritura, y no importa en las lecturas ya que el tipo 'string' no tiene una limitación de longitud. Entonces, ¿para qué sirve este mapeo? –

+0

Sé que esta es una vieja pregunta, pero pensé que agregaría para futuros lectores. Una razón es si usa primero el código para luego crear la base de datos, las anotaciones api/data fluidas se usan para construir las declaraciones de la tabla de creación, donde necesita saber la longitud deseada, y así sucesivamente. – Kate

3

Luché con esto por un tiempo hoy, y esto no es estrictamente la validación del cliente, ya que requiere un viaje redondo, pero le permite beneficiarse del resumen de validación y ayudantes de mensajes en la plantilla estándar. Dentro de su método de acción del controlador simplemente envuelva su llamada SaveChanges() en un intento - captura y agrega los errores resultantes de la ModelState de la siguiente manera:

try { 

    //This does not pick up fluent validation failures 
    if (ModelState.IsValid) { 
     db.Entity.Add(entity); 
     db.SaveChanges(); 
     //Users want to create loads of my entities without seeing the index... 
     return RedirectToAction("Create"); 
    } 

} catch (DbEntityValidationException e) { 

    //Log errors 
    foreach (var result in e.EntityValidationErrors) { 
     foreach(var error in result.ValidationErrors){ 
      ModelState.AddModelError(error.PropertyName, error.ErrorMessage); 
     } 
    } 

} 

//return to view with current model + validation errors 
return View(entity) 

Por supuesto, esto requiere un poco más de trabajo si va a guardar múltiples entidades aquí .

Por supuesto, el uso de un modelo de objetos Ver como Ladislav sugiere que sería el enfoque correcto, sin embargo he utilizado esto para soportar una interfaz de usuario de prueba solicitada por abajo las pruebas de integración de sistemas antes de lo previsto ...

Cuestiones relacionadas