2009-08-03 16 views
5

Estoy usando LinqToSQL, creando mis entidades con el diseñador en estudio que crea muy bien la clase de diseñador con todas las entidades-clases correspondientes. Normalmente cuando quería añadir algunas cosas personalizadas a mis entidades, creaba una clase parcial y hacía las cosas personalizadas allí. Aquí está mi problema; el nuevo ASP.NET MVC 2 (vista previa) contiene algún buen soporte de validación de anotación de datos, que le permite hacer algo como:Cómo obtener un control personalizado sobre la característica de validación de anotación de datos en ASP.NET MVC 2 utilizando LinqToSQL?

public class Customer 
{ 
    [Required(ErrorMessage = "Name is Required")] 
    public string Name { get; set; } 
} 

¿Alguien puede aconsejarme cómo manejar esto? Tenía la esperanza de no crear una clase extra y hacer algún tipo de mapeo ... :(Y sería bueno mantener la validación de mis entidades en mis entidades :)

Espero tener algo de sentido aquí. . gracias por adelantado.

+0

Pensé que la validación anotada de tal manera que describas sonaba clara también al principio. Sin embargo, he tenido algunos casos donde sería bueno tener más control sobre el mensaje de validación dependiendo del contexto. Por ejemplo, un objeto 'Dirección' que puede ser una dirección postal o una Dirección física --- simplemente decir "la ciudad es obligatoria" no parece ser lo suficientemente útil ... – Funka

+0

oh, lo siento, y mi punto es que el clase de amigos no es tan malo. Para que sea menos doloroso trabajar con ellos, alguien más en SO me envió a Automapper (http://www.codeplex.com/AutoMapper), que podría serle útil. – Funka

Respuesta

2

Todo el mundo tiene una opinión diferente, pero yo soy el tipo de persona que sigue adelante y edita los archivos generados. Si puedo agregar una clase parcial, lo haré, pero en casos como este, seguiré editando la propiedad en el archivo generado.

Muchos archivos generados deben tratarse como un andamio que es suyo una vez que el generador lo escupió. Una vez que empiezas a pensar de esa manera, algunas cosas pueden ser mucho más fáciles. Por cierto, yo no recomendaría este enfoque para un archivo que se va a regenerar a menudo ya que eso crearía muchos más dolores de cabeza.

+1

Mientras todos los involucrados estén al tanto de los cambios y se establezca algún tipo de control para garantizar que no se sobrescriban descuidadamente, esta es una solución bastante buena. Tal vez podrías escribir algunas pruebas unitarias que aseguraran que los atributos se mantengan en su lugar. –

+0

... estoy de acuerdo con lo que Allen dijo, RE: teniendo una prueba para apoyar tal práctica. Existe el peligro de que dentro de 6 meses, su archivo generado automáticamente se regenere, y quizás usted no esté cerca para volver a poner las cosas como estaban antes o incluso darse cuenta de que han cambiado. – Funka

0

Gracias por compartir su punto de vista sobre esto. Pensé en eso, pero no estoy seguro si quiero eso.

La solución que surgió fue hacer que todas mis entidades generadas fueran abstractas, y todas mis propiedades virtuales, nombrándolas "DBCustomer" por ejemplo, y creando una clase heredada de "Cliente". A continuación, anula todas las propiedades y llama a base.PropertyName en getters y setters. ¿Qué piensas sobre eso?

+0

Creo que querías comentar su publicación, no responder la tuya. Si no tienes suficiente representante para comentar, ponlo en tu pregunta original. Otros (no yo) probablemente rechazarán esta "respuesta" –

+1

@ Allen: si hiciste la pregunta, puedes comentarla y todas sus respuestas, independientemente de la rep. – Jon

+0

ahh, gracias Jon –

3

si uso LinqToSQL para generar una clase, siempre creo una versión ligera del contenedor de datos de la clase con un postfijo de Datos. Luego uso esa clase para transferir datos a/desde el cliente/servidor.

Puede que no describa esto a la perfección, pero creo que es una práctica común.

Say LinqToSql le ofrece una clase de automóvil con una identificación interna, puertas int, color de cadena, llantas int basadas en la tabla Cars. Me gustaría crear

public class CarData 
{ 
    [Required(ErrorMessage = "ID is Required")] 
    public int id { get; set; } 

    [Required(ErrorMessage = "doors are Required")] 
    public int doors { get; set; } 

    [Required(ErrorMessage = "color is Required")] 
    public string color { get; set; } 

    [Required(ErrorMessage = "wheels are Required")] 
    public int wheels { get; set; } 
} 

Incluso puede utilizar LINQ para seleccionar un nuevo uno de ellos a través de

var myCar = 
    from c in MyDataContext.Cars 
    where c.id == 1 
    select new CarData() 
    { 
      id = c.id, 
      doors = c.doors, 
      color = c.color, 
      wheels = c.wheels 
    }; 

Además, podrá retener LINQ to SQL de delayed execution functionality con esto también. De todos modos, deberías agregar esos atributos a esta clase de "Datos" (como se muestra), de esa manera tienes una clase ligera especializada que se serializa fácilmente y tiene todos los atributos de validación que deseas.

3

Me encontré con este problema con MVC V1 y xVal. Terminé usando "clases de compañeros" como se detalla aquí Schotime (caché de google ya que tiene problemas con el sitio web).

Funciona muy bien para mí, pero no estoy familiarizado con el método de MVC v2 para saber si sus rutinas "captarán" los metadatos en sus clases de amigos.

Es difícil discutir con cualquiera que empiece con "todos tienen una opinión diferente", pero detestaría modificar los archivos generados para LINQ. Veo el punto acerca de un andamio, pero cuando estoy en desarrollo estoy haciendo tantos cambios en mi base de datos (y relaciones) que frecuentemente dejo caer una clase y la vuelvo a crear arrastrando la tabla nuevamente. A veces elimino todas las clases y arrastro todo el DB. Por otro lado, supongo que esto es evidencia de una mala planificación de mi parte.

+0

La publicación de Scott Guthrie en MVC V2 menciona específicamente el uso de "clases de amigos" para un caso como este, así que apostaría a que es la mejor manera de resolver esto. http://weblogs.asp.net/scottgu/archive/2009/07/31/asp-net-mvc-v2-preview-1-released.aspx –

+0

No me atrevería a llamarla la "mejor" manera. ¿No se lamenta Scott por lo molesto que esto es actualmente necesario y cómo quiere que se solucione en el futuro? Estoy bastante seguro de haberlo escuchado decir en un video de Mix09, pero no del todo seguro. –

+0

Bueno, si actualmente es necesario, ¿no es actualmente la mejor manera de resolverlo? Estoy de acuerdo en que en el futuro espero que exista una mejor implementación. Además, todo lo que digo sobre MVC se basa en mi conocimiento limitado, ya que he aprendido sobre él, pero aún no he encontrado tiempo para usarlo realmente. –

Cuestiones relacionadas