SQLMetal e Pluralize
Questa è una delle domande che ho ricevuto in questi giorni durante il Roadshow del lancio.
Se avete un database con i nomi delle tabelle in italiano (ad esempio la tabella Clienti) ed usate il designer di Visual Studio 2008 in inglese per lavorare con LINQ to SQL, vi sarete accorti che se fate l'usuale drag-&-drop della tabella Clienti sul designer per creare una nuova classe, vi troverete poi la classe Clienti, ma verrà anche esposta una proprietà della classe specializzata dal DataContext, che si chiamerà Clientis con la 's' finale. Il comportamento è ovviamente corretto, ma la 's' finale può dare un po' fastidio. La modalità di funzionamento del designer viene chiamata pluralize. Il comportamento di default tiene conto degli standard sulla nomenclatura usata dalle classi e collezioni .NET, che sono ovviamente in inglese e tende a dare nomi al plurale alle collezioni di classi.Il designer di Visual Sudio 2008 non fa altro che generare codice .NET che potete modificare a mano nel progetto.
Al posto del designer di Visual Studio è anche utilizzabile il tool SQLMetal, in cui questa funzionalità di "pluralizzazione" può essere esplicitata tramite il flag /pluralize e quindi modificare questo comportamento.
SQLMetal è il tool che fa quello che fa il designer di Visual Studio, ma da riga di comando in cui avete la possibilità di impostare una serie di opzioni documentate al link sopra.
Nota:nella versione Italiana di Visual Studio 2008 il designer di LINQ to SQL non ha la funzione di pluralize attiva.
Spero che questo piccolo suggerimento sia utile per facilitare la nomenclature di classi e collezioni.
Comments
Anonymous
March 05, 2008
PingBack from http://msdnrss.thecoderblogs.com/2008/03/06/sqlmetal-e-pluralize/Anonymous
February 17, 2009
Ottima segnalazione, questo era proprio quello che ti avevamo chiesto! Grazie :-) P.S. Segnalo questo tool che oltre a rendere la vita più semplice permettendo di gestire la pluralization in modo comodo consente anche di effettuare sostituzioni al volo (tipo dei classici _ del DB) e fa altre cosette carine: http://www.huagati.com/dbmltools/ Ciao!Anonymous
May 27, 2009
Salve, Ho scaricato tutti i webcast segnalati e ho iniziato a lavorarci su... Ho rinominato la tabella TblAnagrafica in TblAnagraficas (per non avere problemi) e ho provato a collegarmi con un asp:LinqDataSource e una formview in bounding (tutto OK) poi ho provato a eseguire del codice come suo es. AnagraficaDataContext dc = new AnagraficaDataContext(); tblAnagrafica anaTemp = (from p in dc.tblAnagraficas where p.AnaCodice == 4033 select p).Single(); ma quest'ultima riga mi da un errore che non sono riuscito a spiegarmi ... Mi potrebbe aiutare ? PS. non so se sono nel post giusto.... Saluti Marco Questo e' il msg di errore La stringa deve essere esattamente di un carattere. Descrizione: Eccezione non gestita durante l'esecuzione della richiesta Web corrente. Per ulteriori informazioni sull'errore e sul suo punto di origine nel codice, vedere l'analisi dello stack. Dettagli eccezione: System.FormatException: La stringa deve essere esattamente di un carattere. Errore nel codice sorgente: Riga 26: AnagraficaDataContext dc = new AnagraficaDataContext(); Riga 27: Riga 28: tblAnagrafica anaTemp = (from p in dc.tblAnagraficas where p.AnaCodice == 4033 select p).Single(); Riga 29: Riga 30: return anaTemp; File di origine: d:MP3OfficeBoxLQOfficeBoxAnagrafica_Edit.aspx.cs Riga: 28 Analisi dello stack: [FormatException: La stringa deve essere esattamente di un carattere.] System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult) +847 System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries) +113 System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) +344 System.Data.Linq.DataQuery1.System.Linq.IQueryProvider.Execute(Expression expression) +49 System.Linq.Queryable.Single(IQueryable
1 source) +269 Anagrafica_Edit.GetRecordAnagrafica(Int32 currentId) in d:MP3OfficeBoxLQOfficeBoxAnagrafica_Edit.aspx.cs:28 Anagrafica_Edit.Page_Load(Object sender, EventArgs e) in d:MP3OfficeBoxLQOfficeBoxAnagrafica_Edit.aspx.cs:82 System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +14 System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +35 System.Web.UI.Control.OnLoad(EventArgs e) +99 System.Web.UI.Control.LoadRecursive() +50 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +627