2011-02-24 13 views
5

Tengo curiosidad de por qué la validación de datos se realiza mediante clases de compañeros. Considere el siguiente ejemplo, donde MyEntity es una entidad Linq-to-SQL o Linq-to-Entities, y la clase siguiente es una clase parcial que mejora la entidad.¿Por qué se usan clases de amigos para la validación?

[MetadataType(typeof(MyEntity.MyEntityMetadata))] 
public partial class MyEntity 
{ 
    private class MyEntityMetadata 
    { 
     [Required(ErrorMessage = "The title is required.")] 
     public string Title { get; set; } 
    } 
} 

¿Por qué es el diseño así? Cuando diseñaron DataAnnotations, ¿por qué se seleccionó este "patrón de amigos"? ¿Por qué no colocar los atributos directamente en la entidad?

+2

Según entiendo, le permite ampliar las características fuera del diseñador. Odiaría ajustar los atributos de los metadatos solo para que la próxima actualización del diseñador los elimine por completo. –

+0

Responsabilidad individual ¿Principal? –

Respuesta

4

El motivo es práctico: en linq-to-sql y linq-to-entities, el código que representa las clases se regenera cada vez que se actualiza el modelo de objetos. Para que las anotaciones no se sobrescriban cuando esto sucede, deben estar en una clase de "compañero" separada.

Si está utilizando las anotaciones de datos en un contexto diferente, digamos para un modelo de vista, entonces pueden ir a la clase original.

+0

No sabía que los atributos se podían ubicar en la clase de datos directamente, como directamente en el Modelo de visualización. Respuesta marcada para el detalle adicional. Gracias. – kbrimington

+0

"patrón de amigos" - no es un "patrón", es solo para evitar la maldad. nunca un gran diseño de los equipos de MS. – hB0

5

Supongo que esto evita que las entidades generadas sobrescriban la información personalizada de metadatos.

+4

Creo que tienes razón. ¡Qué feo truco, sin embargo! –

+0

+1: Gracias por la respuesta rápida y correcta. – kbrimington

Cuestiones relacionadas