2009-08-03 11 views
5

Sto usando LinqToSQL, creando le mie entità con il designer in studio che crea in modo carino la classe del designer con tutte le corrispondenti classi di entità. Normalmente quando volevo aggiungere alcune cose personalizzate alle mie entità, creavo una classe parziale e facevo le cose personalizzate lì. Ecco il mio problema; il nuovo ASP.NET MVC 2 (anteprima) contiene qualche bel supporto convalida annotazione dei dati, che consente di fare qualcosa di simile:Come ottenere il controllo personalizzato sulla funzionalità di convalida dell'annotazione dei dati in ASP.NET MVC 2 utilizzando LinqToSQL?

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

qualcuno mi può consigliare come gestire questa situazione? Speravo di non creare una classe extra e fare una sorta di mappatura .. :(E sarebbe bello mantenere la validazione delle mie entità nelle mie entità :)

Spero di avere un senso qui. . Grazie in anticipo.

+0

Ho pensato che la convalida annotata in un modo che tu descrivi all'inizio fosse anche bella. Tuttavia, ho avuto alcuni casi in cui sarebbe più opportuno controllare meglio il messaggio di convalida a seconda del contesto. Ad esempio, un oggetto "Indirizzo" che può essere o un indirizzo postale o un indirizzo fisico --- semplicemente "la città è richiesta" non sembra abbastanza utile ... – Funka

+0

oh, mi dispiace, e così il mio punto è, il la classe dei compagni non è una cosa così brutta. Per renderli meno dolorosi con cui lavorare, qualcun altro qui su SO mi ha indirizzato ad Automapper (http://www.codeplex.com/AutoMapper), che potresti trovare utile. – Funka

risposta

2

Ognuno ha un'opinione diversa, ma io sono il tipo di persona che va avanti e modifica i file generati. Se posso aggiungere una classe parziale, lo farò, ma per casi come questo andrei avanti e modificherò la proprietà nel file generato.

Un sacco di file generati devono essere trattati come uno scaffold che è tuo una volta che il generatore lo ha sputato. Quando inizi a pensarci in questo modo, alcune cose possono diventare molto più semplici. Dal modo in cui io non difendere questo approccio per un file che verrà rigenerato spesso in quanto ciò creerebbe molti più mal di testa.

+1

Fintanto che tutte le persone coinvolte sono consapevoli dei cambiamenti e viene messo in atto un qualche tipo di controllo per garantire che non vengano incautamente sovrascritti, allora questa è una soluzione piuttosto buona. Forse potresti scrivere alcuni test unitari per garantire che gli attributi rimangano al loro posto. –

+0

... sono d'accordo con ciò che Allen ha detto, RE: avere un test in atto per supportare tale pratica. Esiste il pericolo che tra 6 mesi il file generato automaticamente venga rigenerato, e forse non sei in giro per rimettere le cose come prima o addirittura notare che sono cambiate. – Funka

0

Grazie per aver condiviso il tuo punto di vista su questo. Ci ho pensato, ma non sono sicuro di volerlo.

La soluzione in cui mi trovavo da sola era rendere tutte le mie entità generate astratte e tutte le mie proprietà virtuali, nominandole "DBCustomer" per esempio e creando una classe "Cliente" ereditata. Quindi sovrascrivere tutte le proprietà e chiamare base.PropertyName nei getter e setter. Cosa ne pensi di questo?

+0

Penso che volevi commentare il suo post, non rispondere ai tuoi. Se non hai abbastanza rep per commentare, mettilo nella tua domanda originale. Altri (non io) molto probabilmente svuoteranno questa "risposta" –

+1

@Allen: se hai posto la domanda, puoi commentare su di essa e tutte le sue risposte - indipendentemente dalla ripetizione. – Jon

+0

ahh, grazie Jon –

3

se utilizzo LinqToSQL per generare una classe, creo sempre una versione di contenitore dati leggero della classe con un suffisso di Data. Quindi uso quella classe per trasferire i dati da/verso il client/server.

Potrei non descriverlo perfettamente, ma credo che sia una pratica abbastanza comune.

Dire LinqToSql offre una classe di auto con int id, porte int, colore stringa, ruote int basate sulla tabella Auto. Mi piacerebbe creare

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; } 
} 

È anche possibile utilizzare LINQ per selezionare un nuovo uno di questi via

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 
    }; 

Potrai anche mantenere LINQ to SQL di delayed execution functionality con questo pure. Ad ogni modo, dovresti aggiungere quegli attributi a questa classe "Data" (come mostrato), in questo modo hai una classe leggera specializzata che serializza facilmente e ha tutti gli attributi di convalida che desideri.

3

Mi sono imbattuto in questo problema con MVC V1 e xVal. Ho finito per usare "buddy classes" come dettagliato qui Schotime (cache di Google perché ha problemi con il sito web).

Funziona perfettamente per me, ma non ho familiarità con il metodo MVC v2 di fare questo per sapere se le sue routine "raccoglieranno" i metadati nelle classi di amici.

È difficile discutere con qualcuno che inizi con "ognuno ha un'opinione diversa", ma sarei dispiaciuto di modificare i file generati per LINQ. Vedo il punto su un'impalcatura, ma quando sono in fase di sviluppo sto apportando così tante modifiche al mio db (e alle relazioni) che di solito trascuro una classe e la ricreavo trascinando indietro la tabella. A volte rimuovo tutte le classi e trascino l'intero db sopra. D'altra parte, immagino che questa sia la prova di una cattiva pianificazione da parte mia.

+0

Il post di Scott Guthrie su MVC V2 menziona espressamente l'uso di "buddy classes" per un caso come questo, quindi scommetto che è il modo migliore per risolvere questo problema. http://weblogs.asp.net/scottgu/archive/2009/07/31/asp-net-mvc-v2-preview-1-released.aspx –

+0

Sarei restio a definirlo il modo "migliore". Scott non si lamenta di quanto sia fastidioso che questo sia attualmente necessario e di come vorrà che venga risolto in futuro? Sono abbastanza sicuro di averlo sentito dire in un video Mix09, non sicuro al 100%. –

+0

Bene, se è attualmente necessario, allora non è attualmente il modo migliore per risolverlo? Sono d'accordo sul fatto che in futuro mi auguro che esisterà una migliore attuazione. Inoltre, tutto ciò che dico su MVC si basa sulla mia conoscenza limitata come ho imparato a riguardo, ma non ho ancora trovato il tempo di usarlo ancora. –

Problemi correlati