Crad's .NET Blog http://blogs.ugidotnet.org/Crad/Default.aspx L'UGIblog di Marco De Sanctis it-IT Marco De Sanctis Subtext Version 2.6.0.0 Crad's .NET Blog http://blogs.ugidotnet.org/images/RSS2Image.gif http://blogs.ugidotnet.org/Crad/Default.aspx 77 60 Che somiglianza... Off topic http://blogs.ugidotnet.org/Crad/archive/2008/07/30/che-somiglianza.aspx <p>Ci ho fatto caso proprio oggi :D</p> <p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="258" alt="image" src="http://www.marcodesanctis.it/images/Blog/Chesomiglianza_98AF/image.png" width="410" border="0" /></p><img src="http://blogs.ugidotnet.org/Crad/aggbug/93573.aspx" width="1" height="1" /> Marco De Sanctis http://blogs.ugidotnet.org/Crad/archive/2008/07/30/che-somiglianza.aspx Wed, 30 Jul 2008 11:54:39 GMT http://blogs.ugidotnet.org/Crad/archive/2008/07/30/che-somiglianza.aspx#feedback 3 http://blogs.ugidotnet.org/Crad/comments/commentRss/93573.aspx Dal profondo del cuore... Misc http://blogs.ugidotnet.org/Crad/archive/2008/06/30/dal-profondo-del-cuore.aspx <p>...mi sento di dover dire grazie a due persone. Veramente. Non ho parole. Mi avete reso veramente felice.</p><img src="http://blogs.ugidotnet.org/Crad/aggbug/93227.aspx" width="1" height="1" /> Marco De Sanctis http://blogs.ugidotnet.org/Crad/archive/2008/06/30/dal-profondo-del-cuore.aspx Mon, 30 Jun 2008 17:31:10 GMT http://blogs.ugidotnet.org/Crad/archive/2008/06/30/dal-profondo-del-cuore.aspx#feedback 1 http://blogs.ugidotnet.org/Crad/comments/commentRss/93227.aspx Il mio nuovo blog Misc http://blogs.ugidotnet.org/Crad/archive/2008/05/08/il-mio-nuovo-blog.aspx <p>Da un paio di giorni è online il mio nuovo blog (in lingua inglese) all'indirizzo</p> <p><a href="http://www.codemetropolis.com">http://www.codemetropolis.com</a></p> <p>I contenuti saranno più o meno gli stessi di questo (NHibernate, LINQ, ASP.NET, WPF, and so on..), spero di riuscire ad aggiornarlo con una maggiore frequenza e continuità e di mettere a posto con il tempo la skin, che attualmente è ancora un po' grezzotta e manca addirittura del mio faccione! :-)</p> <p>Per quanto riguarda il blog su UGI, ho intenzione di lasciarlo in vita, anche se gli argomenti saranno limitati a quanto concerne la community italiana.</p> <p>Ciauz!</p><img src="http://blogs.ugidotnet.org/Crad/aggbug/92572.aspx" width="1" height="1" /> Marco De Sanctis http://blogs.ugidotnet.org/Crad/archive/2008/05/08/il-mio-nuovo-blog.aspx Thu, 08 May 2008 10:56:04 GMT http://blogs.ugidotnet.org/Crad/archive/2008/05/08/il-mio-nuovo-blog.aspx#feedback 5 http://blogs.ugidotnet.org/Crad/comments/commentRss/92572.aspx LINQ to Sql e Guid autogenerati .Net 3.5 http://blogs.ugidotnet.org/Crad/archive/2008/05/06/linq-to-sql-e-guid-autogenerati.aspx <p>Durante la realizzazione del layer di accesso ai dati di una semplice demo app, per il quale avevo scelto di utilizzare LINQ to Sql, sono incorso in un noioso bug nel recupero dei valori delle PrimaryKey, nel caso in cui questi siano autogenerati dal server di database.</p> <p>Supponiamo di avere una tabella del tipo seguente, in cui la PK sia di tipo <em>uniqueidentifier</em>, automaticamente inizializzata per le nuove righe tramite la funzione di sistema <em>newid()</em>:</p> <p><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="198" alt="image" src="http://www.marcodesanctis.it/images/Blog/BugdiLinqToSql_9A8F/image.png" width="274" border="0" /> </p> <p>Creiamo un nuovo DataContext di LINQ to Sql e importiamo al tabella creata; il designer crea una nuova entity con i campi omonimo delle colonne sul database:</p> <p><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="119" alt="image" src="http://www.marcodesanctis.it/images/Blog/BugdiLinqToSql_9A8F/image11.png" width="204" border="0" /> </p> <p>Spesso, lato schema DB, i nomi delle chiavi contengono un riferimento alla tabella a cui appartengono. Per quanto riguarda le entità di dominio, invece, preferisco che gli identificativi si chiamino tutti allo stesso modo, sia per una questione di uniformità e leggibilità (non essendoci FK ma semplici riferimenti, non ho più la necessità di avere nomi diversi), sia perchè, ad esempio, potrei pensare di far implementare a tutte le mie entity un'interfaccia <em>IHasIdentifier</em> che esponga la proprietà <em>Id</em> e utilizzarla per implementare un GetById generico. Quindi, forte delle mie convinzioni, procedo alla modifica sulla entità di L2S generata dal designer:</p> <p><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="120" alt="image" src="http://www.marcodesanctis.it/images/Blog/BugdiLinqToSql_9A8F/image14.png" width="205" border="0" /> </p> <p>Inoltre, mi ricordo anche di impostare, sulla property grid, che la proprietà Id è auto generata da DB e che deve essere recuperata dopo una query di Insert:</p> <p><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="174" alt="image" src="http://www.marcodesanctis.it/images/Blog/BugdiLinqToSql_9A8F/image20.png" width="244" border="0" /> </p> <p>In fase di fetch, LINQ to Sql svolge egregiamente il suo lavoro, trasformando correttamente ogni condizione sulla proprietà <em>Id</em> in una where sulla colonna <em>MySampleId</em>:</p> <p><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="106" alt="image" src="http://www.marcodesanctis.it/images/Blog/BugdiLinqToSql_9A8F/image_3.png" width="313" border="0" /> </p> <p><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="57" alt="image" src="http://www.marcodesanctis.it/images/Blog/BugdiLinqToSql_9A8F/image_4.png" width="405" border="0" /> </p> <p>Ciò purtroppo non accade quando, dopo una query di Insert, L2S tenta di recuperare il valore della chiave generata da database. Come si nota dalla query, infatti, viene erroneamente cercata una colonna chiamata Id, con successivo ed ovvio errore di Sql Server.</p> <p><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="78" alt="image" src="http://www.marcodesanctis.it/images/Blog/BugdiLinqToSql_9A8F/image_5.png" width="353" border="0" /></p> <p><a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=3289312&amp;SiteID=1">Ho segnalato</a> il problema nei forum di MSDN, e mi è stato risposto che si tratta di un bug che verrà corretto con il rilascio del SP1. Attualmente ci sono solo due soluzioni:</p> <ol> <li>Utilizzare i medesimi nomi per proprietà e colonne</li> <li>Inizializzare manualmente la proprietà ad un nuovo Id sul costruttore della entity</li> </ol> <p>Un'ultima curiosità: tutto ciò non si verifica nel caso in cui la PK sia un Identity e il motivo è che, in quel caso, Linq to Sql utilizza <em>SELECT SCOPE_IDENTITY</em> per recuperare il nuovo valore.</p> <div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:4c2a6d22-964d-4850-880b-2a968731448d" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati Tags: <a href="http://technorati.com/tags/LINQ%20to%20Sql" rel="tag">LINQ to Sql</a></div><img src="http://blogs.ugidotnet.org/Crad/aggbug/92534.aspx" width="1" height="1" /> Marco De Sanctis http://blogs.ugidotnet.org/Crad/archive/2008/05/06/linq-to-sql-e-guid-autogenerati.aspx Tue, 06 May 2008 14:09:22 GMT http://blogs.ugidotnet.org/Crad/archive/2008/05/06/linq-to-sql-e-guid-autogenerati.aspx#feedback 7 http://blogs.ugidotnet.org/Crad/comments/commentRss/92534.aspx Un ottimo esempio di usabilit&agrave; Misc http://blogs.ugidotnet.org/Crad/archive/2008/04/17/un-ottimo-esempio-di-usabilitagrave.aspx <p>Lo dà il sito del New York Times: leggo un articolo, ma... "ehi, cosa vuol dire questo termine?"</p> <p>Basta un doppio click per aprire un eccellente dizionario in popup.</p> <p><a href="http://www.nytimes.com/2008/04/17/us/politics/17debate.html?_r=1&amp;ex=1366171200&amp;en=5b45f4566903b046&amp;ei=5088&amp;partner=rssnyt&amp;emc=rss&amp;oref=slogin">Esempio</a></p><img src="http://blogs.ugidotnet.org/Crad/aggbug/92252.aspx" width="1" height="1" /> Marco De Sanctis http://blogs.ugidotnet.org/Crad/archive/2008/04/17/un-ottimo-esempio-di-usabilitagrave.aspx Thu, 17 Apr 2008 11:42:18 GMT http://blogs.ugidotnet.org/Crad/archive/2008/04/17/un-ottimo-esempio-di-usabilitagrave.aspx#feedback http://blogs.ugidotnet.org/Crad/comments/commentRss/92252.aspx Un mio articolo sui Custom Extender di ASP.NET 3.5 ASP.NET AJAX http://blogs.ugidotnet.org/Crad/archive/2008/04/08/un-mio-articolo-sui-custom-extender-di-asp.net-3.5.aspx <p>Sul sito di <a href="http://www.aspitalia.com/">Aspitalia.com</a> è stato pubblicato <a href="http://www.aspitalia.com/articoli/asp.net3.5/ajax-custom-extender.aspx">un mio articolo</a> sulla realizzazione di un custom extender in ASP.NET 3.5.</p> <p>Con il bravo <a href="http://blogs.aspitalia.com/rickyvr/">Riccardo</a> abbiamo deciso di settarne il livello a 300 data la natura non proprio immediata, in ogni modo mi sono sforzato di rendere il tutto il più semplice possibile.</p> <p>Colgo l'occasione di ringraziare tutto lo staff di Aspitalia per l'opportunità che mi è stata data.</p> <div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:637fb264-a6ff-4c51-a872-e7f3b6ba0c6d" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati Tags: <a href="http://technorati.com/tags/ASP.NET" rel="tag">ASP.NET</a>,<a href="http://technorati.com/tags/AJAX" rel="tag">AJAX</a></div><img src="http://blogs.ugidotnet.org/Crad/aggbug/92100.aspx" width="1" height="1" /> Marco De Sanctis http://blogs.ugidotnet.org/Crad/archive/2008/04/08/un-mio-articolo-sui-custom-extender-di-asp.net-3.5.aspx Tue, 08 Apr 2008 11:36:27 GMT http://blogs.ugidotnet.org/Crad/archive/2008/04/08/un-mio-articolo-sui-custom-extender-di-asp.net-3.5.aspx#feedback http://blogs.ugidotnet.org/Crad/comments/commentRss/92100.aspx [NHibernate] Mapping di un dictionary NHibernate http://blogs.ugidotnet.org/Crad/archive/2008/02/05/nhibernate-mapping-di-un-dictionary.aspx <p>Non mi stancherò mai di decantare la versatilità di NHibernate nel supportare domain model eterogenei. Esempio pratico: il nostro sito internet ha un sacco di pagine pressoché statiche, tipo il classico "Chi siamo", "Mission dell'Azienda", ecc.ecc.</p> <p>Vogliamo permettere all'amministratore di inserire questi dati nel DB, ma vogliamo anche lasciarci la strada aperta ad aggiunte future, così se domani il cliente si sveglia e vuole anche una bella pagina con i contatti, possiamo aggiungerla senza modificare lo schema.</p> <p>Un'idea può essere quella di contenere tutti questi dati all'interno di un bel Dictionary, ma come lo mappiamo con NHibernate?</p> <p>Presto detto, basta utilizzare il tag &lt;map&gt; come segue:</p> <p> </p><div class="wlWriterSmartContent" id="F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:6ed330ec-560a-4cc4-9592-8a1d13ed4773" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="width:100%;background-color:#EEEEEE;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #999999;">1</span> <span style="color: #0000FF;">&lt;</span><span style="color: #800000;">map </span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="CustomElements"</span><span style="color: #FF0000;"> generic</span><span style="color: #0000FF;">="true"</span><span style="color: #FF0000;"> table</span><span style="color: #0000FF;">="WebsiteCustomElements"</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #999999;">2</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">key </span><span style="color: #FF0000;">column</span><span style="color: #0000FF;">="ParentId"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;"> </span><span style="color: #999999;">3</span> <span style="color: #000000;"> </span><span style="color: #999999;">4</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">index </span><span style="color: #FF0000;">column</span><span style="color: #0000FF;">="ItemName"</span><span style="color: #FF0000;"> type</span><span style="color: #0000FF;">="string"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;"> </span><span style="color: #999999;">5</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">element </span><span style="color: #FF0000;">column</span><span style="color: #0000FF;">="Value"</span><span style="color: #FF0000;"> type</span><span style="color: #0000FF;">="string"</span><span style="color: #FF0000;"> length</span><span style="color: #0000FF;">="3000"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;"> </span><span style="color: #999999;">6</span> <span style="color: #000000;"></span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">map</span><span style="color: #0000FF;">&gt;</span></div></pre></div> <p>In questo modo NHibernate utilizzerà una tabella WebsiteCustomElements con le colonne ParentId, ItemName e Value per persistere il contenuto del nostro Dictionary.</p> <p> </p><div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:712d7199-568a-4922-9545-3b6a5bb56ce2" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati tags: <a href="http://technorati.com/tags/NHibernate" rel="tag">NHibernate</a></div><img src="http://blogs.ugidotnet.org/Crad/aggbug/91013.aspx" width="1" height="1" /> Marco De Sanctis http://blogs.ugidotnet.org/Crad/archive/2008/02/05/nhibernate-mapping-di-un-dictionary.aspx Tue, 05 Feb 2008 02:12:04 GMT http://blogs.ugidotnet.org/Crad/archive/2008/02/05/nhibernate-mapping-di-un-dictionary.aspx#feedback 8 http://blogs.ugidotnet.org/Crad/comments/commentRss/91013.aspx Costanti pubbliche? AHIAHIAHI .Net 2.0 .Net 3.0 .Net 3.5 Architettura http://blogs.ugidotnet.org/Crad/archive/2008/01/31/costanti-pubbliche-ahiahiahi.aspx <p>Premessa: ciò che scriverò è una banalità, ma secondo me in tanti non ne sono al corrente o non ci pensano. Di cosa parlo? Di cose del genere:</p> <p> </p><div class="wlWriterSmartContent" id="F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:23264bd7-da92-41a5-ba6e-3c35ed74d666" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="width:100%;;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">int</span><span style="color: #000000;"> MyConst </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">10</span><span style="color: #000000;">;</span></div></pre></div> <p>Il danno potenziale che le <strong>costanti pubbliche </strong>possono creare alla stabilità delle nostre applicazioni è enorme.</p> <p>Why? Perché le costanti non sono altro che <strong>placeholder</strong> risolti <strong>in fase di compilazione</strong>. Questo vuol dire che, finché non si ricompila, il valore non viene aggiornato.</p> <p>Implicazioni?</p> <ol> <li>Assembly A che definisce una costante MyConst = 10</li> <li>Assembly B che referenzia Assembly A e ne utilizza MyConst</li> <li>Assembly A cambia MyConst a 15</li> <li><strong>Finché non ricompilo Assembly B</strong>, questo continua a vedere MyConst = 10</li></ol> <p>Ogni tanto mi capita di trovare righe di codice simili a quella in alto, con seguenti bug "strani" e dolori per scovarli. Ecco perché cerco sempre di abituare i junior che lavorano con me alla regola:</p> <blockquote> <p><em><strong>Le costanti devono essere sempre private o internal. Se serve esporle allora si utilizzino dei field readonly</strong>.</em></p></blockquote> <p>Augh!</p> <p> </p><div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:e23a99d5-f626-4d0a-a547-d6a97a6dad5b" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati tags: <a href="http://technorati.com/tags/Costanti" rel="tag">Costanti</a>, <a href="http://technorati.com/tags/Readonly%20field" rel="tag">Readonly field</a></div><img src="http://blogs.ugidotnet.org/Crad/aggbug/90956.aspx" width="1" height="1" /> Marco De Sanctis http://blogs.ugidotnet.org/Crad/archive/2008/01/31/costanti-pubbliche-ahiahiahi.aspx Thu, 31 Jan 2008 16:15:13 GMT http://blogs.ugidotnet.org/Crad/archive/2008/01/31/costanti-pubbliche-ahiahiahi.aspx#feedback 6 http://blogs.ugidotnet.org/Crad/comments/commentRss/90956.aspx [ADO.NET Entity Framework #0] Per iniziare .Net 3.5 http://blogs.ugidotnet.org/Crad/archive/2008/01/22/ado.net-entity-framework-0-per-iniziare.aspx <p>Ho da poco iniziato a studiare ADO.NET Entity Framework e vorrei pubblicare impressioni, tip, ecc.ecc. man mano che imparo qualcosa.</p> <p>Il primo passo per iniziare a lavorare con questo ORM di Microsoft è quello di fare qualche download, per cui oggi mi limiterò a fornire qualche link utile per utilizzare la beta 3 (in attesa della definitiva) su VS2008. La lista della spesa è più o meno questa, in ordine di installazione:</p> <ol> <li>ADO.NET Entity Framework Beta 3: <a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=15DB9989-1621-444D-9B18-D1A04A21B519&amp;displaylang=en">qui</a></li> <li>Patch per installazione su VS2008 RTM: <a href="http://go.microsoft.com/fwlink?LinkID=104985">qui</a></li> <li>ADO.NET E.F. Tools (CTP di dicembre 2007): <a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=D8AE4404-8E05-41FC-94C8-C73D9E238F82&amp;displaylang=en">qui</a></li> <li>SQL Server 2005, c'è la Express Edition scaricabile <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=220549b5-0b07-4448-8848-dcc397514b41&amp;displaylang=en">qui</a></li></ol> <p>That's all...</p> <p>Per iniziare a smanettare, consiglio di dare un'occhiata a <a href="http://msdn2.microsoft.com/en-us/library/bb399182.aspx">questo (MOOOOOLTO SEMPLICE) quickstart</a> e a <a href="http://www.codeplex.com/adonetsamples">questo progetto</a> su Codeplex</p> <p> </p> <div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:901a8853-749c-4dd6-9423-2041d822d484" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati tags: <a href="http://technorati.com/tags/Entity%20Framework" rel="tag">Entity Framework</a></div><img src="http://blogs.ugidotnet.org/Crad/aggbug/90805.aspx" width="1" height="1" /> Marco De Sanctis http://blogs.ugidotnet.org/Crad/archive/2008/01/22/ado.net-entity-framework-0-per-iniziare.aspx Tue, 22 Jan 2008 10:58:34 GMT http://blogs.ugidotnet.org/Crad/archive/2008/01/22/ado.net-entity-framework-0-per-iniziare.aspx#feedback 5 http://blogs.ugidotnet.org/Crad/comments/commentRss/90805.aspx Grande Simo!! Misc http://blogs.ugidotnet.org/Crad/archive/2007/12/19/grande-simo.aspx <p>E bravo il <a href="http://blogs.ugidotnet.org/piyo/Default.aspx">nostro</a> <a href="http://codeclimber.net.nz/">Simone</a>! Dopo ScottGu (pardon, non ritrovo il link al volo), citato anche da <a href="http://blogs.msdn.com/brada/archive/2007/12/18/ajax-usage-among-net-developers.aspx">Brad Abrams</a>!!</p> <p>Notevole.</p> <p>Peccato che ultimamente si sia fissato con tutto ciò che è Apple!</p><img src="http://blogs.ugidotnet.org/Crad/aggbug/90349.aspx" width="1" height="1" /> Marco De Sanctis http://blogs.ugidotnet.org/Crad/archive/2007/12/19/grande-simo.aspx Wed, 19 Dec 2007 10:56:46 GMT http://blogs.ugidotnet.org/Crad/archive/2007/12/19/grande-simo.aspx#feedback 2 http://blogs.ugidotnet.org/Crad/comments/commentRss/90349.aspx