Tengo la siguiente clase generada por el marco de la entidad:
public partial class ItemRequest
{
public int RequestId { get; set; }
//...
Me gustaría hacer de este un campo obligatorio
[Required]
public int RequestId { get;set; }
Sin embargo, debido a que este es un código generado, se borrará. No puedo imaginar una forma de crear una clase parcial porque la propiedad está definida por la clase parcial generada. ¿Cómo puedo definir la restricción de forma segura?
c#
entity-framework
asp.net-mvc-4
P. Brian Mackey
fuente
fuente
Respuestas:
La clase generada
ItemRequest
siempre será unapartial
clase. Esto le permite escribir una segunda clase parcial que está marcada con las anotaciones de datos necesarias. En su caso, la clase parcialItemRequest
se vería así:fuente
Como respondió MUG4N , puede usar clases parciales, pero será mejor usar interfaces en su lugar. En este caso, tendrá errores de compilación si el modelo EF no se corresponde con el modelo de validación. Por lo tanto, puede modificar sus modelos EF sin temor a que las reglas de validación estén desactualizadas.
PD Si está utilizando un tipo de proyecto que es diferente de ASP.NET MVC (cuando realiza la validación manual de datos) no olvide registrar sus validadores
fuente
Encontré una solución como la respuesta de MUG4N , pero en cambio, anidando la
MetaData
clase dentro de la clase de entidad, reduciendo así el número de clases en su lista de espacios de nombres públicos y eliminando la necesidad de tener un nombre único para cada clase de metadatos.fuente
[NotMapped]
dentro de la clase parcial también cuando las necesito.Esta es una especie de extensión de la respuesta de @dimonser. Si regenera su modelo de base de datos, tendrá que volver a agregar manualmente las interfaces en esas clases.
Si tienes estómago para ello también puedes modificar tus
.tt
plantillas:Aquí hay un ejemplo de interfaces de generación automática en algunas clases, este es un fragmento de
.tt
simplemente reemplazar elEntityClassOpening
método en el suyo con el siguiente (y obviamentevar stringsToMatch
con los nombres de sus entidades e interfaces).Sin embargo, ninguna persona normal debería hacerse esto a sí mismo, se ha demostrado en la Biblia que uno va al infierno por esto.
fuente
No estoy seguro de cómo hacer lo que estás pidiendo, pero hay una forma de evitarlo. Validación dinámica de datos anulando los GetValidators de su DataAnnotationsModelValidatorProvider personalizado. En él puede leer las reglas para validar cada campo (de una base de datos, archivo de configuración, etc.) y agregar validadores según sea necesario. Tiene los valores agregados de que su validación ya no está estrechamente unida al modelo y se puede cambiar sin necesidad de reiniciar el sitio. Por supuesto que podría ser excesivo para su caso, ¡pero fue ideal para el nuestro!
fuente
Modifique la plantilla T4 agregando las anotaciones requeridas, este archivo generalmente se llama MODELNAME.tt
encuentre dónde está creando el T4 la clase y los métodos para saber dónde colocarlos.
También deberá agregar los espacios de nombres;
Reconstruya sus clases guardando su modelo, todos sus métodos deben estar anotados.
fuente