Rails tiene una validación de singularidad muy conveniente.Validación ASP.NET MVC de unicidad
ASP.NET MVC no lo hace.
Necesito asegurarme de que la dirección de correo electrónico que ha ingresado un usuario aún no ha sido registrada por nadie.
Solo puedo ver una forma de hacer este tipo de validación: crear un nuevo objeto de contexto de datos en la clase UniqueAttribute.
Pero me temo que desperdiciar memoria en un nuevo objeto de contexto de datos solo para una validación es peligroso.
¿Estoy equivocado? ¿Hay una mejor manera de hacer eso?
actualización
Esto es lo que tengo hasta ahora
public class UniqueEmailAttribute : ValidationAttribute {
public override bool IsValid(object value) {
DataContext db = new DataContext();
var userWithTheSameEmail = db.Users.SingleOrDefault(
u => u.Email == (string)value);
return userWithTheSameEmail == null;
}
}
// Usage
[UniqueEmail(ErrorMessage="This e-mail is already registered")]
public string Email { get; set; }
Hay dos problemas.
Sería bueno tener una sola clase UniqueAttribute, no clases separadas para los mensajes de correo electrónico, nombres de usuario, etc. ¿Cómo puedo hacer eso?
Crear un nuevo contexto de datos cada vez que necesite validar un solo atributo.
SOLUCIÓN
Así que al final me creado una restricción única en la tabla y ahora sólo hay que interceptar SqlException en el repositorio usuarios. Funciona muy bien y es probablemente más eficiente que buscar el mismo nodo en toda la tabla. ¡Gracias!
Rails vs ASP.NET MVC es como comparar manzanas con naranjas, no son lo mismo. ASP.NET MVC no tiene una capa de persistencia de datos formal, tiene que elegir uno de los muchos, y luchar con ese – TFD
@TFD, ese es un buen punto. Estoy de acuerdo, no hay capa de datos, por lo que el DataContext debe almacenarse en algún lugar, de eso se trata mi pregunta. – Alex
1] De forma predeterminada, el nombre de propiedad al que se aplica el atributo se envía al método de acción como un parámetro de cadena de consulta. – swapneel