2009-10-08 15 views
12

Estoy intentando implementar Anotación de datos en mis objetos Linq a SQL. Se genera el archivo .dbml y no estoy seguro de cómo agregar la anotación de datos a los objetos sin tocar el código fuente generado.ASP.NET MVC, Validación de anotación de datos de Linq a SQL

Intenté agregar anotaciones de datos a una clase parcial separada del objeto, pero no lo reconoce, tampoco tiene sentido Intelli.

Respuesta

22

Como dije en mi respuesta original a esta pregunta, debería usar una interfaz. La respuesta publicada después de la mía (que fue marcada como Aceptada) dice usar una clase. Esto no es tan bueno.Una interfaz es una mejor opción por las siguientes razones:

  • Si hay una discrepancia entre el nombre de su clase LINQ y el nombre de la interfaz, el compilador marcarlo para que
  • una interfaz no puede instanciar, por lo que este protege a los usuarios de clase de instatntiating accidentalmente el tipo de metadatos
  • Si utiliza ReSharper (o similar), la interfaz se puede extraer automáticamente de la clase LINQ
  • una interfaz es menos detallado que una clase vacía
  • Si programa contra int erfaces en lugar de clases (que es una buena práctica), entonces usted ha conseguido ya una interfaz se puede usar como metadatos de tipo

Para una clase llamada, diga "Usuario", crear una interfaz para ello (por ejemplo 'IUser') y, a continuación, actualizar la definición de la clase de usuario parcial de la siguiente manera:

[MetadataType(typeof(IUser))] 
public class User : IUser 

luego, en la interfaz de IUser, añadir atributos de anotación de datos adecuada a las propiedades:

[Required]  
[StringLength(50, ErrorMessage = "Username cannot exceed 50 characters")] 
string Username { get; set; } 
+1

Me gusta mucho este enfoque, excepto que no puedo agregar un atributo [Bind (Exclude = "ID")] a la interfaz, así que tuve que ponerlo en el clase. Eso funciona, pero los metadatos ahora están divididos entre la clase y la interfaz. – palmsey

+0

Pero, ¿qué debo hacer si tengo algún campo adicional en mi modelo? Por ejemplo, tengo el campo adicional 'Confirmar contraseña'. Si pongo este campo en el compilador de la interfaz, no pasaré esto porque no hay tal campo en la base de la clase SQL. – kseen

+0

Pero, ¿cómo puedo generar estos atributos automáticamente? El dbml tiene todo lo que necesita para generarlos. Tengo 20 tablas con docenas de columnas en cada ... No voy a tratar de mantener eso manualmente. ¿Alguien tiene una solución? –

9

Para una clase llamada, diga "Usuario", crear una interfaz para que (dicen 'IUser'), y luego actualizar la definición de la clase de usuario parcial de la siguiente manera:

[MetadataType(typeof(IUser))] 
public class User : IUser 

Luego, en su IUsuario de la interfaz, agregue atributos de anotación de datos apropiados a las propiedades:

[Required]  
[StringLength(50, ErrorMessage = "Username cannot exceed 50 characters")] 
string Username { get; set; } 
6

Linq a SQL genera clases de objetos como parciales. Una forma fácil de implementar anotaciones de datos es crear su propia clase parcial del objeto, colocar [MetadataType (typeof (YourDataAnnotationClass))] en la clase parcial que creó.

Ejemplo:

// Linq to SQL Class 
public partial class Article 
{ 
    public string Title { get; set; } 
    ...... etc 
} 

crear su propia clase metadatos con metadatos para cada campo que desea validar

public class MyMetaDataClass 
{ 
    [Required] 
    [Range(5,20)] 
    public string Title { get; set; } 
} 

crear una clase parcial para la clase de objeto que desea añadir metadatos a, en este caso Clase de artículos:

[MetadataType(typeof(MyMetaDataClass))] 
public partial class Article { } 

Nota: no necesita especificar nada en la clase, solo el tipo de metadata.

+0

baddie, te falta claridad –

2

Gracias, pero el problema es M S definen el prototipo de MetadataTypeAttrubute como

[AttributeUsageAttribute(AttributeTargets.Class, AllowMultiple = false, Inherited = false)] 
public sealed class MetadataTypeAttribute : Attribute 

Por lo tanto, se tenía que utilizar la clase pero no interactuar


de China Bosque Lee: 李晓强 [email protected] (MSN) lixiaoqiang @ webservice.com.cn

+1

Funciona incluso con la interfaz independientemente de lo que dice la definición. –

+0

No puedo hacer que funcione ni la interfaz ni la clase :(Estoy tratando de agregar IgnoreDataMember a algunos de las propiedades autogeneradas de mis clases parciales en un proyecto WCF –

Cuestiones relacionadas