2010-06-08 12 views
10

He utilizado Entity Framework con VS2010 para crear una clase de persona simple con propiedades, firstName, lastName y correo electrónico. Si deseo adjuntar DataAnnotations como se hace en este blog post, tengo un pequeño problema porque mi clase de persona se genera dinámicamente. Podría editar directamente el código generado dinámicamente, pero cada vez que tenga que actualizar mi modelo, todo mi código de validación se borrará.Uso de DataAnnotaciones con Entity Framework

El primer instinto fue crear una clase parcial y tratar de adjuntar anotaciones, pero se queja de que estoy tratando de redefinir la propiedad. No estoy seguro si puede hacer declaraciones de propiedades en C# como declaraciones de funciones en C++. Si pudieras esa podría ser la respuesta. He aquí un fragmento de lo que he intentado:

namespace PersonWeb.Models 
{ 
    public partial class Person 
    { 
    [RegularExpression(@"(\w|\.)[email protected](\w|\.)+", ErrorMessage = "Email is invalid")] 
    public string Email { get; set; } 
    /* ERROR: The type 'Person' already contains a definition for 'Email' */ 
    } 
} 
+0

Estoy realmente decepcionado de que no pueda definir una clase parcial y decorarla con anotaciones de datos como se muestra en la muestra del código. Ese fue mi primer instinto; luego me encontré con esta publicación y no veo ninguna solución que me parezca atractiva. El equipo de ef debe proporcionar un mecanismo de mapeo para eludir esta idiosincrasia más bien molesta. – nocarrier

Respuesta

24

Una clase de amigos es más o menos la dirección el fragmento de código está en camino, a excepción de su clase Persona parcial codificado manualmente tendría una clase interna, como:

[MetadataType(typeof(Person.Metadata))] 
public partial class Person { 
    private sealed class MetaData { 
     [RegularExpression(...)] 
     public string Email { get; set; } 
    } 
} 

O usted podría tener su clase Persona parcial manualmente y una clase Meta separada como:

[MetadataType(typeof(PersonMetaData))] 
public partial class Person { } 

public class PersonMetaData { 
[RegularExpression(...)] 
public string Email; 
} 

Estos son soluciones provisionales y que tiene una clase de presentación asignada puede ser más adecuado.

+0

¿Sería tan amable de explicar la "clase de presentación mapeada" que mencionó? –

+0

Claro. Probablemente debería haber dicho View Model en lugar de clase de presentación. El enlace en el comentario de Craig Stuntz a continuación tiene un ejemplo. También: http://stackoverflow.com/questions/2859618/should-i-map-a-domain-object-to-a-view-model-using-an-optional-constructor http://stackoverflow.com/questions/8298401/patterns-for-mapping-data-between-domain-models –

3

Es necesario utilizar una clase de "amigo" o metadatos (mi preferencia) project onto a presentation model instead of binding views directly to entities.

+0

¿Puede dar más detalles sobre su enfoque a las clases de "amigos" de metadatos? Prefiero que el código de presentación y la validación tengan una separación de preocupaciones. – dcompiled

+0

"Mi enfoque" para las clases "amigas" es no usarlas. Como dije, uso modelos de presentación. Si desea * real * separación de preocupaciones, ese es el camino a seguir. –

+0

Es solo cuestión de estilo, creo que todo el código de validación y los metadatos asociados deben permanecer únicamente en el modelo. Parece que prefieres tener un código de validación mezclado con el modelo de presentación. – dcompiled