<?xml version="1.0" encoding="iso-8859-15"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>blogs.ASPItalia.com</title><link>http://blogs.aspitalia.com</link><description>blogs.ASPItalia.com</description><language>it-it</language><managingEditor>noreply(at)aspitalia.com(blogs.ASPItalia.com)</managingEditor><webMaster>daniele(at)aspitalia.com(Daniele Bochicchio)</webMaster><copyright>1998-2008 ASPItalia.com/blogs.ASPItalia.com</copyright><generator>Generated by feed.ASPItalia.com 'Weyoh' 4.8.908</generator><sy:updatePeriod>hourly</sy:updatePeriod><sy:updateFrequency>1</sy:updateFrequency><sy:updateBase>1998-01-01T12:00+00:00</sy:updateBase><image><title>blogs.ASPItalia.com</title><url>http://gui.aspitalia.com/images/aspitalia_syndication.gif</url><link>http://blogs.aspitalia.com</link></image><item><title>Entity Framework. Una tabella due Entity senza discriminazioni</title><link>http://blogs.aspitalia.com/az/post2383/Entity-Framework.-Tabella-Entity-Discriminazioni.aspx</link><pubDate>Sat, 06 Sep 2008 08:52:04 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2383' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;In un &lt;a href="http://blogs.aspitalia.com/az/post2377/entity-framework-ereditarieta-single-table-inheritance.aspx"&gt;blog precedente&lt;/a&gt; avevo parlato del &lt;em&gt;Single Table Inheritance&lt;/em&gt;. Grazie ad un campo apposito è possibile decidere a quale &lt;em&gt;entity&lt;/em&gt; farà parte il record di quella nostra tabella.&lt;/p&gt; &lt;p&gt;Il problema che sto cercando di risolvere in questi giorni si basa sul quesito:&lt;/p&gt; &lt;p&gt;&lt;em&gt;E' possibile dividere una tabella in due entity &lt;strong&gt;senza&lt;/strong&gt; questo campo?&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Ma prima che subentri la confusione, il mio obbiettivo non è quello di creare due &lt;em&gt;entity&lt;/em&gt; parallele come nel caso di quel blog (&lt;em&gt;TextContents&lt;/em&gt; e &lt;em&gt;LinkContents&lt;/em&gt;), ma una &lt;em&gt;entity&lt;/em&gt; di base da cui deriva un'altra &lt;em&gt;entity&lt;/em&gt;. Per esempio, da questa tabella:&lt;/p&gt; &lt;table cellspacing="0" cellpadding="2" width="400" border="1" unselectable="on"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td  width="200"&gt;&lt;strong&gt;&lt;em&gt;Nome campo&lt;/em&gt;&lt;/strong&gt;&lt;/td&gt; &lt;td  width="200"&gt;&lt;strong&gt;&lt;em&gt;Tipo&lt;/em&gt;&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td  width="200"&gt;&lt;em&gt;Id&lt;/em&gt;&lt;/td&gt; &lt;td  width="200"&gt;&lt;em&gt;int&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td  width="200"&gt;&lt;em&gt;Title&lt;/em&gt;&lt;/td&gt; &lt;td  width="200"&gt;&lt;em&gt;nvarchar(50)&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td  width="200"&gt;&lt;em&gt;LongDescriptions&lt;/em&gt;&lt;/td&gt; &lt;td  width="200"&gt;&lt;em&gt;ntext&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;Vorrei ottenere una struttura come questa (poi spiegherò il perché):&lt;/p&gt; &lt;p&gt;&lt;img height="300" alt="nuove entity" src="http://blogs.aspitalia.com/img/andrewz/ent.unatabelladueentitysenzadiscriminazi_8fd2/image_1.png" width="180" border="0" /&gt; &lt;/p&gt; &lt;p&gt;Il problema che mi ero posto è molto semplice: in caso volessi visualizzare tutti i record della tabella in un menu di scelta, la richiesta dei dati presenti in un'unica &lt;em&gt;entity&lt;/em&gt; avrebbe richiesto tutti i campi anche quelli &lt;em&gt;ntext&lt;/em&gt; (che potrebbero contenere, per assurdo, mega di documenti di testo), come si può evitare questo?&lt;/p&gt; &lt;p&gt;Ah, dimenticavo, visto che questi dati devono attraversare dei layer dell'applicativo, non voglio usare gli anonynous type, altrimenti sarebbe troppo facile scrivere:&lt;/p&gt; &lt;p&gt;&lt;em&gt;var coll=from d in Context.Documents&lt;br /&gt; select new { Id=d.Id, Title=d.Title };&lt;br /&gt;return coll;&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Anche se questa soluzione porta l'&lt;em&gt;Entity Framework&lt;/em&gt; a inviare la giusta query al database:&lt;/p&gt; &lt;p&gt;&lt;em&gt;SELECT &lt;br /&gt;1 AS [C1], &lt;br /&gt;[Extent1].[Id] AS [Id], &lt;br /&gt;[Extent1].[Title] AS [Title]&lt;br /&gt;FROM [dbo].[Descriptions] AS [Extent1]&lt;/em&gt; &lt;p&gt;Una soluzione che mi hanno suggerito è creare una classe che ospiti solo quei dati: &lt;p&gt;&lt;em&gt;public class Elenco&lt;br /&gt;{&lt;br /&gt; public int Id { get; set; }&lt;br /&gt; public string Title { get; set; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var coll = from c in context.Descriptions&lt;br /&gt; select new Elenco { Id = c.Id, Title = c.Title };&lt;br /&gt;foreach (var item in coll)&lt;br /&gt;{&lt;br /&gt; Response.Write(string.Format(&lt;br /&gt; "{0} {1} &amp;lt;br /&amp;gt;",&lt;br /&gt; item.Id,&lt;br /&gt; item.Title&lt;br /&gt; ));&lt;br /&gt;} &lt;/em&gt; &lt;p&gt;Può andare. Si potrebbe trovare un'altra soluzione con l'uso delle viste. Creata questa vista: &lt;p&gt;&lt;em&gt;select Id,Title from Descriptions&lt;/em&gt; &lt;p&gt;Si possono creare due &lt;em&gt;entity&lt;/em&gt; distinte all'interno dell'editor di &lt;em&gt;Visual Studio 2008&lt;/em&gt;: &lt;p&gt;&lt;img height="322" alt="due entity con tabella e vista" src="http://blogs.aspitalia.com/img/andrewz/ent.unatabelladueentitysenzadiscriminazi_8fd2/image_3.png" width="190" border="0" /&gt; &lt;p&gt;Lo schifo è che sono due &lt;em&gt;entity&lt;/em&gt; distinte, ma risolvono in parte il problema. Segnalo che, importata questa vista nell'editor, i campi vengono visti entrambi come &lt;em&gt;key&lt;/em&gt;. Non è sufficiente modificare le proprietà nell'editor, è necessario aprire il file .edmx con un editor xml e cancellare la doppia key: &lt;p&gt;&lt;em&gt;&amp;lt;EntityType Name="DescriptionsTitles"&amp;gt;&lt;br /&gt; &amp;lt;Key&amp;gt;&lt;br /&gt; &amp;lt;PropertyRef Name="Id" /&amp;gt;&lt;br /&gt; &amp;lt;PropertyRef Name="Title" /&amp;gt;&lt;strong&gt; &amp;lt;-- Da cancellare&lt;br /&gt;&lt;/strong&gt; &amp;lt;/Key&amp;gt;&lt;br /&gt; &amp;lt;Property Name="Id" Type="int" Nullable="false" StoreGeneratedPattern="Identity" /&amp;gt;&lt;br /&gt; &amp;lt;Property Name="Title" Type="nvarchar" Nullable="false" MaxLength="50" /&amp;gt;&lt;br /&gt;&amp;lt;/EntityType&amp;gt;&lt;br /&gt;&amp;lt;EntityType Name="DescriptionsTitles"&amp;gt;&lt;br /&gt; &amp;lt;Key&amp;gt;&lt;br /&gt; &amp;lt;PropertyRef Name="Id" /&amp;gt;&lt;br /&gt; &amp;lt;PropertyRef Name="Title" /&amp;gt; &lt;strong&gt;&amp;lt;-- Da cancellare&lt;br /&gt;&lt;/strong&gt; &amp;lt;/Key&amp;gt;&lt;br /&gt; &amp;lt;Property Name="Id" Type="Int32" Nullable="false" /&amp;gt;&lt;br /&gt; &amp;lt;Property Name="Title" Type="String" Nullable="false" /&amp;gt;&lt;br /&gt;&amp;lt;/EntityType&amp;gt;&lt;/em&gt; &lt;p&gt;Poco sopra nell'xml è possibile vedere com'è importata la vista:&lt;/p&gt; &lt;p&gt;&lt;em&gt; &amp;lt;EntitySet Name="DescriptionsTitles" EntityType="TestEntitiesModel.Store.DescriptionsTitles" store:Type="Views" store:Schema="dbo" store:Name="DescriptionsTitles"&amp;gt;&lt;br /&gt; &amp;lt;DefiningQuery&amp;gt;SELECT &lt;br /&gt;[DescriptionsTitles].[Id] AS [Id], &lt;br /&gt;[DescriptionsTitles].[Title] AS [Title]&lt;br /&gt;FROM [dbo].[DescriptionsTitles] AS [DescriptionsTitles]&lt;br /&gt; &amp;lt;/DefiningQuery&amp;gt;&lt;br /&gt; &amp;lt;/EntitySet&amp;gt;&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Questo comporta, alla richiesta dei dati, l'esecuzione di questa query:&lt;/p&gt; &lt;p&gt;&lt;em&gt;SELECT &lt;br /&gt;[Extent1].[Id] AS [Id], &lt;br /&gt;[Extent1].[Title] AS [Title]&lt;br /&gt;FROM (SELECT &lt;br /&gt; [DescriptionsTitles].[Id] AS [Id], &lt;br /&gt; [DescriptionsTitles].[Title] AS [Title]&lt;br /&gt; FROM [dbo].[DescriptionsTitles] AS [DescriptionsTitles]) AS [Extent1]&lt;/em&gt; &lt;p&gt;Alla fine c'è la soluzione compatibile con l'&lt;em&gt;Entity Framework&lt;/em&gt; e la mia necessità. Ma si deve mettere mano alla struttura del database. Si deve dividere quella tabella in due, spostando il campo &lt;em&gt;LongDescriptions&lt;/em&gt; nella seconda naturalmente collegando il tutto. L'EF non farà una piega e vedrà il tutto in modo corretto e otterrei ciò che voglio. &lt;p&gt; &lt;p&gt;&lt;em&gt;Posso avere tutto ciò che voglio? No, non è possibile.&lt;/em&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2383/Entity-Framework.-Tabella-Entity-Discriminazioni.aspx</guid><slash:comments>0</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2383/Entity-Framework.-Tabella-Entity-Discriminazioni.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2383.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2383</trackback:ping></item><item><title>Intellisense in Sql Server 2008</title><link>http://blogs.aspitalia.com/az/post2382/Intellisense-Sql-Server-2008.aspx</link><pubDate>Thu, 04 Sep 2008 17:48:52 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2382' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;C'&amp;#232; una tabella:&lt;/p&gt; &lt;p&gt;&lt;img height="226" alt="lista tabelle in sql server 2008" src="http://blogs.aspitalia.com/img/andrewz/intellisenseinsqlserver2008_115fa/image_6.png" width="226" border="0" /&gt; &lt;/p&gt; &lt;p&gt;L'intellisense c'&amp;#232;?&lt;/p&gt; &lt;p&gt;&lt;img height="260" alt="intellisense in sql server 2008" src="http://blogs.aspitalia.com/img/andrewz/intellisenseinsqlserver2008_115fa/image_5.png" width="514" border="0" /&gt; &lt;/p&gt; &lt;p&gt;Che bello. Cancello la tabella. Rifaccio una query e cosa mi compare?&lt;/p&gt; &lt;p&gt;&lt;img height="305" alt="intellisense con la tabella cancellata" src="http://blogs.aspitalia.com/img/andrewz/intellisenseinsqlserver2008_115fa/image_9.png" width="524" border="0" /&gt;&lt;/p&gt; &lt;p&gt;Ma se l'ho cancellata!!!&lt;/p&gt; &lt;p&gt;Il bello avviene anche con tabelle nuove che non vengono viste dall'intellisense del Managment Studio di Sql Server 2008. Lo si deve riavviare per aggiornare il tutto. &lt;/p&gt; &lt;p&gt;O mi &amp;#232; sfuggito qualcosa? La delusione per&amp;#242; c'&amp;#232;. Bel &lt;strong&gt;&lt;em&gt;bug&lt;/em&gt;&lt;/strong&gt;!!!&lt;/p&gt; &lt;p&gt;&lt;em&gt;Questo problema me l'ha fatto notare un collega, da quando c'&amp;#232; EF, Sql server non lo guardo pi&amp;#249; :-)&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/Database/" rel="tag"&gt;Database&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/SQL_Server/" rel="tag"&gt;SQL Server&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>Software, Database, SQL Server</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2382/Intellisense-Sql-Server-2008.aspx</guid><slash:comments>15</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2382/Intellisense-Sql-Server-2008.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2382.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2382</trackback:ping></item><item><title>Un Anello per domarli, un Anello per trovarli, Un Anello per ghernirli e nel buio incatenarli,</title><link>http://blogs.aspitalia.com/nostromo/post2381/Anello-Domarli-Anello-Trovarli-Anello-Ghernirli-Buio.aspx</link><pubDate>Wed, 03 Sep 2008 23:24:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2381' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;&lt;img align="baseline" src="http://byfiles.storage.live.com/y1pYs5ikKNrAg8aiPYYSPWYSjLjomDPOGeZ6-M2Tdlu6dhTQr2kVmtKTv0VMfykovf1" border="0" hspace="0" complete="true" /&gt;&lt;br /&gt;il giorno si sta sempre più avvicinando...di che giorno si tratta? del giorno in cui ricevo l'anello... ma con meno poteri...l'anello del matrimonio.&lt;/p&gt;&lt;p&gt;Domenica 7 settembre alle 16:00:00&lt;/p&gt;&lt;p&gt;con tutta probabilità sarò un pò assente da giovedi sera, fino alla fine di settembre, a presto!&lt;/p&gt;&lt;p&gt;ciao marco&lt;/p&gt;&lt;p /&gt;&lt;p /&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/Off_Topic/" rel="tag"&gt;Off Topic&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Marco Leoncini</dc:creator><category>Live Life, Off Topic</category><guid isPermaLink="true">http://blogs.aspitalia.com/nostromo/post2381/Anello-Domarli-Anello-Trovarli-Anello-Ghernirli-Buio.aspx</guid><slash:comments>20</slash:comments><wfw:comments>http://blogs.aspitalia.com/nostromo/post2381/Anello-Domarli-Anello-Trovarli-Anello-Ghernirli-Buio.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/nostromo/CommentRSS2381.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2381</trackback:ping></item><item><title>Google Chrome</title><link>http://blogs.aspitalia.com/matteo/post2380/Google-Chrome.aspx</link><pubDate>Wed, 03 Sep 2008 13:29:10 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2380' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;La notizia del rilascio di un browser targato Google &amp;#232; ormai nota, anche se sono passate circa 24 ore dai &lt;a href="http://googleblog.blogspot.com/2008/09/fresh-take-on-browser.html"&gt;primi rumors ufficiali&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Dalla &lt;a href="http://www.google.com/chrome/"&gt;pagina di download&lt;/a&gt; viene presentato come &amp;quot;&lt;em&gt;un browser progettato per rendere pi&amp;#249; &lt;strong&gt;veloce&lt;/strong&gt;, &lt;strong&gt;facile&lt;/strong&gt; e &lt;strong&gt;sicuro&lt;/strong&gt; l'uso del Web con un &lt;strong&gt;design minimo&lt;/strong&gt; che &lt;strong&gt;non intralcia la navigazione&lt;/strong&gt;.&lt;/em&gt;&amp;quot;&lt;/p&gt; &lt;p&gt;Provandolo, seppur in modo decisamente sommario, ho cercato di verificare le &amp;quot;promesse&amp;quot; fatte:&lt;/p&gt; &lt;h3&gt;Veloce&lt;/h3&gt; &lt;p&gt;Niente di pi&amp;#249; vero: semplicemente impressionante! &lt;br /&gt;Voto: 9&lt;/p&gt; &lt;h3&gt;Facile&lt;/h3&gt; &lt;p&gt;In che senso? Ci sono browser &amp;quot;difficili&amp;quot;? Se tralasciamo le funzionalit&amp;#224; avanzata (che l'utente &amp;quot;normale&amp;quot; semplicemente ignora) hanno 4 bottoni in croce e una barra degli indirizzi... &lt;br /&gt;Voto: n.a.&lt;/p&gt; &lt;h3&gt;Sicuro&lt;/h3&gt; &lt;p&gt;S&amp;#236;, come no?! Ci sono volute ben.. poche ore per trovare la &lt;a href="http://blogs.zdnet.com/security/?p=1843"&gt;prima falla&lt;/a&gt;! Ok, &amp;#232; un bug noto e di facile risoluzione per&amp;#242;... &lt;br /&gt;Voto: 4&lt;/p&gt; &lt;h3&gt;Design minimo&lt;/h3&gt; &lt;p&gt;Su questo niente da dire. Resta da valutare se si tratta di un &amp;quot;pro&amp;quot; o di un &amp;quot;contro&amp;quot;. IMHO &amp;#232; decisamente &lt;strong&gt;troppo &lt;/strong&gt;minimal. &lt;br /&gt;Voto: 4&lt;/p&gt; &lt;h3&gt;Non intralcia la navigazione&lt;/h3&gt; &lt;p&gt;Vedi quanto detto per &amp;quot;Facile&amp;quot;: sembra una frase messa l&amp;#236; a caso per completare il periodo. &lt;br /&gt;Voto: n.a.&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;Personalmente aggiungerei qualche altro aggettivo:&lt;/p&gt; &lt;h3&gt;Povero&lt;/h3&gt; &lt;p&gt;Mancano un sacco di funzionalit&amp;#224; ormai basilari, presenti da anni in tutti gli altri browser: supporto RSS, anteprima di stampa, zoom, ecc.&lt;/p&gt; &lt;p&gt;Voto: 4&lt;/p&gt; &lt;h3&gt;Efficiente&lt;/h3&gt; &lt;p&gt;L'aspetto a mio avviso pi&amp;#249; interessante &amp;#232; l'isolamento dei singoli tab che dovrebbe garantire un'ottima stabilit&amp;#224;.&lt;/p&gt; &lt;p&gt;Voto: 9&lt;/p&gt; &lt;h3&gt;Approssimativo&lt;/h3&gt; &lt;p&gt;Alcuni dettagli sembrano buttati l&amp;#236; con poca cura, come la scelta di alcuni termini (specie in italiano): &amp;quot;Roba da smanettoni&amp;quot;, &amp;quot;Statistiche per nerd&amp;quot;, ecc. &lt;br /&gt;Senza contare dettagli implementativi come &amp;quot;Inspect element&amp;quot;. In teoria identica alla versione presente in Safari, soffre di una serie di problemi e sviste considerevoli: manca la localizzazione, il dock alla finestra principale non funziona, lo stile grafico non &amp;#232; coerente (alcuni testi non sono leggibili perch&amp;#233; in bianco su sfondo bianco), la visualizzazione delle risorse richiede un reload della pagina, ecc.&lt;/p&gt; &lt;h3&gt;Prematuro&lt;/h3&gt; &lt;p&gt;Al di l&amp;#224; della mancanza di versioni per OS diversi da Windows, mancano plugin, skin e un sacco di altre cose che potrebbero invogliare l'utente a fare il salto. Sicuramente arriveranno ma al momento si pu&amp;#242; giusto tenere sott'occhio il prodotto in attesa di una versione &amp;quot;vera&amp;quot;.&lt;/p&gt; &lt;p&gt;Voto: n.a.&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;h2&gt;Conclusioni&lt;/h2&gt; &lt;p&gt;Ok, &amp;#232; una &amp;quot;beta&amp;quot;, quindi &amp;#232; presto per dare un giudizio (sebbene Google ci abbia abituato ad avere prodotti decisamente funzionanti anche in beta). &lt;br /&gt;Su molte cose ha per&amp;#242; toppato e l'ha fatto in modo ingenuo: due anni di sviluppo e non hanno trovato un paio di giorni per sistemare qualche dettaglio?&lt;/p&gt; &lt;p&gt;In compenso l'engine sembra ottimo: basato sul migliore a disposizione (&lt;a href="http://webkit.org/"&gt;WebKit&lt;/a&gt;), velocissimo ed efficiente.&lt;/p&gt; &lt;p&gt;Resta la domanda del &amp;quot;&lt;strong&gt;perch&amp;#233;&lt;/strong&gt;&amp;quot; Google ha deciso di riaprire quella &lt;em&gt;browser war&lt;/em&gt; che speravamo di esserci lasciati alle spalle. Al momento l'ipotesi che mi sembra pi&amp;#249; plausibile &amp;#232; &lt;a href="http://weblogs.asp.net/guybarrette/archive/2008/09/03/google-chrome-random-thoughts.aspx"&gt;quella fatta da Guy Barrette&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Resta il fatto che c'&amp;#232; un nuovo player da considerare e, vista da sviluppatore, un altro browser con cui fare i conti (grrrrrr!!!!): infatti ufficialmente quel che funziona su Safari &lt;em&gt;dovrebbe&lt;/em&gt; andare anche su Chrome; il condizionale &amp;#232; d'obbligo, tant'&amp;#232; che ad esempio una libreria come &lt;a href="http://cow.neondragon.net/stuff/reflection/"&gt;Reflection.js&lt;/a&gt; gi&amp;#224; non funziona...&lt;/p&gt; &lt;p&gt;Voi che ne pensate?&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Matteo Casati</dc:creator><category>Misc</category><guid isPermaLink="true">http://blogs.aspitalia.com/matteo/post2380/Google-Chrome.aspx</guid><slash:comments>26</slash:comments><wfw:comments>http://blogs.aspitalia.com/matteo/post2380/Google-Chrome.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/matteo/CommentRSS2380.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2380</trackback:ping></item><item><title>Entity Framework e pi&amp;#249; tabelle in una entity</title><link>http://blogs.aspitalia.com/az/post2379/Entity-Framework-Tabelle-Entity.aspx</link><pubDate>Wed, 03 Sep 2008 07:09:34 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2379' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Breve e coinciso. Due tabelle in una sola &lt;em&gt;entity&lt;/em&gt;. L'&lt;em&gt;Entity Framework&lt;/em&gt; lo permette con pochi passaggi e &lt;strong&gt;non&lt;/strong&gt; in automatico.&lt;/p&gt; &lt;p&gt;Mi servono due tabelle. Eccole:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Tutorials&lt;/strong&gt;&lt;/p&gt; &lt;table cellspacing="0" cellpadding="2" width="400" border="1"&gt;&lt;tbody&gt; &lt;tr&gt; &lt;td  width="200"&gt;&lt;strong&gt;Nome campo&lt;/strong&gt;&lt;/td&gt; &lt;td  width="200"&gt;&lt;strong&gt;Tipo e altro&lt;/strong&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td  width="200"&gt;&lt;em&gt;Id&lt;/em&gt;&lt;/td&gt; &lt;td  width="200"&gt;&lt;em&gt;Int, key, Auto increment&lt;/em&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td  width="200"&gt;&lt;em&gt;Name&lt;/em&gt;&lt;/td&gt; &lt;td  width="200"&gt;&lt;em&gt;nvarchar&lt;/em&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td  width="200"&gt;&lt;em&gt;Description&lt;/em&gt;&lt;/td&gt; &lt;td  width="200"&gt;&lt;em&gt;Text&lt;/em&gt;&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;&lt;strong&gt;Tutorials2&lt;/strong&gt;&lt;/p&gt; &lt;table cellspacing="0" cellpadding="2" width="400" border="1"&gt;&lt;tbody&gt; &lt;tr&gt; &lt;td  width="200"&gt;&lt;strong&gt;Nome campo&lt;/strong&gt;&lt;/td&gt; &lt;td  width="200"&gt;&lt;strong&gt;Tipo e altro&lt;/strong&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td  width="200"&gt;&lt;em&gt;Id&lt;/em&gt;&lt;/td&gt; &lt;td  width="200"&gt;&lt;em&gt;Int, key&lt;/em&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td  width="200"&gt;&lt;em&gt;Name&lt;/em&gt;&lt;/td&gt; &lt;td  width="200"&gt;&lt;em&gt;nvarchar&lt;/em&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td  width="200"&gt;&lt;em&gt;Description&lt;/em&gt;&lt;/td&gt; &lt;td  width="200"&gt;&lt;em&gt;Text&lt;/em&gt;&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;Ora importiamo le due tabelle nel &lt;em&gt;designer&lt;/em&gt; di Visual Studio 2008. Creer&amp;#224; due &lt;em&gt;entity&lt;/em&gt; distinte. Non ci servono a nulla. Vanno cancellate. Quindi dalla &lt;em&gt;toolbar&lt;/em&gt;, inserire una nuovo oggetto &lt;em&gt;Entity&lt;/em&gt; e si mappano all'interno le due tabelle e tutti i campi, naturalmente inserendo nell'editor tante propriet&amp;#224; quante ne servono. Il risultato finale deve essere simile a questo:&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;img height="568" alt="mapping entity framework" src="http://blogs.aspitalia.com/img/andrewz/entityframeworkepitabelleinunaentity_80c1/immagine%204_3.gif" width="510" border="0" /&gt; &lt;/p&gt; &lt;p&gt;Tutto fatto. Ora possiamo farne quello che vogliamo:&lt;/p&gt; &lt;p&gt;&lt;em&gt;using (pubsModel.pubsEntities context = new pubsModel.pubsEntities()) &lt;br /&gt;{ &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; pubsModel.Tutorials obj = new pubsModel.Tutorials(); &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; obj.Name1 = &amp;quot;A1&amp;quot;; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; obj.Name2 = &amp;quot;A2&amp;quot;; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; obj.Description1 = &amp;quot;D1&amp;quot;; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; obj.Description2 = &amp;quot;D2&amp;quot;; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; context.AddToTutorialsSet(obj); &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; context.SaveChanges(); &lt;br /&gt;} &lt;/em&gt;&lt;/p&gt; &lt;p&gt;Un ringraziamento a &lt;a title="link esterno" href="http://blogs.dotnethell.it/david/"&gt;David&lt;/a&gt; che mi ha dato un ottimo suggerimento a riguardo. Ora ho solo un unico dubbio e poi con l'&lt;em&gt;EF&lt;/em&gt; spacco tutto: dividere una tabella in due o pi&amp;#249; &lt;em&gt;entity&lt;/em&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2379/Entity-Framework-Tabelle-Entity.aspx</guid><slash:comments>0</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2379/Entity-Framework-Tabelle-Entity.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2379.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2379</trackback:ping></item><item><title>L'Entity Framework e le custom class coinvolte nei where...</title><link>http://blogs.aspitalia.com/az/post2378/LEntity-Framework-Custom-Class-Coinvolte-Where.aspx</link><pubDate>Sun, 31 Aug 2008 01:04:02 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2378' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Riprendo il solito esempio di &lt;em&gt;entity&lt;/em&gt;:&lt;/p&gt; &lt;p&gt;&lt;img alt="entity in visual studio 2008" src="http://blogs.aspitalia.com/img/andrewz/entityframew.unminimodicachefacevaschifo_10861/image_6.png" /&gt; &lt;/p&gt; &lt;p&gt;Ipotizzando di voler recuperare tutti gli &lt;em&gt;Articles&lt;/em&gt; con un determinato colore si potrebbe essere spinti a scrivere:&lt;/p&gt; &lt;p&gt;&lt;em&gt;var c=Context.Colors.Where(cc=&amp;gt;cc.Id==1).First();&lt;br /&gt;var coll=from ar in Context.Articles.Include("Colors")&lt;br /&gt; where ar.Colors=c&lt;br /&gt; select ar;&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Semplicemente, avendo una &lt;em&gt;entity&lt;/em&gt; voglio vedere tutte le &lt;em&gt;entity&lt;/em&gt; che hanno come &lt;em&gt;property&lt;/em&gt; questo oggetto. Eseguita, però, si ottienere questo errore:&lt;/p&gt; &lt;p&gt;&lt;em&gt;Unable to create a constant value of type 'Closure type'. Only primitive types (for instance Int32, String and Guid) are supported in this context.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Questo perché l'EF non permette il confronto tra &lt;em&gt;oggetti complessi&lt;/em&gt;. La soluzione è banale, anzi, in qualche caso più semplice (nel caso di &lt;em&gt;web control&lt;/em&gt; che ritornano un valore numerico per identificare una scelta di un utente, per sempio da un &lt;em&gt;dropdownlist&lt;/em&gt;):&lt;/p&gt; &lt;p&gt;&lt;em&gt;int c=int.Parse(ddl_colors.SelectedValue); // &amp;lt;- prendo il colore selezionato&lt;br /&gt;var coll=from ar in Context.Articles.Include("Colors")&lt;br /&gt; where ar.Colors.Id=c&lt;br /&gt; select ar;&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Oppure:&lt;/p&gt; &lt;p&gt;&lt;em&gt;var c=Context.Colors.Where(cc=&amp;gt;cc.Id==1).First();&lt;br /&gt;var coll=from ar in Context.Articles.Include("Colors")&lt;br /&gt; where ar.Colors.Id=c.Id&lt;br /&gt; select ar;&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Soluzione semplice, ma è sempre bene saperla.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2378/LEntity-Framework-Custom-Class-Coinvolte-Where.aspx</guid><slash:comments>2</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2378/LEntity-Framework-Custom-Class-Coinvolte-Where.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2378.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2378</trackback:ping></item><item><title>Entity Framework e l'ereditariet&amp;#224; (Single Table Inheritance)</title><link>http://blogs.aspitalia.com/az/post2377/Entity-Framework-Ereditarieta-Single-Table-Inheritance.aspx</link><pubDate>Sat, 30 Aug 2008 13:07:56 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2377' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Visto che in questi gioni sto usando parecchio con l'&lt;em&gt;Entity Framework&lt;/em&gt; questa &lt;em&gt;Table Per Hierarchy&lt;/em&gt; (Emanuele mi correggerà se, come al solito, sbaglio la nomenclatura), ecco due appunti su come si realizza con l'editor che mette a disposizione Visual Studio 2008.&lt;/p&gt; &lt;p&gt;L'inizio è questa semplice tabella dal nome &lt;em&gt;BaseContents&lt;/em&gt;:&lt;/p&gt; &lt;p&gt;&lt;img height="180" alt="struttura tabella" src="http://blogs.aspitalia.com/img/andrewz/entityframeworkelereditarietsingletablei_c776/image_1.png" width="340" border="0" /&gt; &lt;/p&gt; &lt;p&gt;Da questa singola tabella è possibile estrarre due &lt;em&gt;entity&lt;/em&gt; distinte. Nel mio caso:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;TextContents &lt;li&gt;LinkContents&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;La prima utilizzata per memorizzare il contenuto reale di un eventuale testo, la seconda per link a risorse esterne. All'interno di questa singola tabella sono contenuti tutti i campi per memorizzare queste informazioni. L'unico campo aggiuntivo, che farà da &lt;em&gt;discriminante&lt;/em&gt;, come si vedrà di seguito, è &lt;em&gt;Type&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;Creato in Visual Studio 2008 un nuovo oggetto &lt;em&gt;ADO.Net Entity Data Model&lt;/em&gt;, e importanto all'interno di questo oggetto la tabella sopra mostrata, si avrà la prima &lt;em&gt;entity&lt;/em&gt; creata in automatico dall'ambiente di sviluppo con tutti i campi interessati.&lt;/p&gt; &lt;p&gt;Ora è possibile aggiunere le entity mancanti, &lt;em&gt;TextContents&lt;/em&gt; e &lt;em&gt;LinkContents&lt;/em&gt;, ereditandole direttamente da questa (è sufficiente cliccare con il tasto destro all'interno dell'editor e selezionare &lt;em&gt;Add&lt;/em&gt; -&amp;gt; &lt;em&gt;Entity&lt;/em&gt;). Aggiunte le due entity ecco cosa abbiamo in VS 2008:&lt;/p&gt; &lt;p&gt;&lt;img height="346" alt="entity" src="http://blogs.aspitalia.com/img/andrewz/entityframeworkelereditarietsingletablei_c776/image_7.png" width="342" border="0" /&gt; &lt;/p&gt; &lt;p&gt;Ora possiamo spostare le &lt;em&gt;property&lt;/em&gt; di nostro interesse nelle sottostanti &lt;em&gt;entity &lt;/em&gt;per ottenere questo:&lt;/p&gt; &lt;p&gt;&lt;img height="376" alt="entity" src="http://blogs.aspitalia.com/img/andrewz/entityframeworkelereditarietsingletablei_c776/image_9.png" width="340" border="0" /&gt; &lt;/p&gt; &lt;p&gt;Dalla window Mapping details, mappiamo la tabella e assicurati che tutti i campi interessati siamo mappati correttamente, possiamo inserire la condizione discriminante, in modo che nell'uso di una o dell'altra entity, siano salvati i dati corretti nella tabella. Nulla di difficile, sempre da &lt;em&gt;Mapping details&lt;/em&gt;, si aggiunge nelle &lt;em&gt;condition&lt;/em&gt;:&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.aspitalia.com/img/andrewz/entityframeworkelereditarietsingletablei_c776/image_10.png" atomicselection="true"&gt;&lt;img height="174" alt="conditions" src="http://blogs.aspitalia.com/img/andrewz/entityframeworkelereditarietsingletablei_c776/image_thumb_5.png" width="520" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;In questo caso ho inserito il valore &lt;em&gt;1&lt;/em&gt; in &lt;em&gt;Type&lt;/em&gt; per il &lt;em&gt;TextContents&lt;/em&gt;, e &lt;em&gt;2&lt;/em&gt; per il &lt;em&gt;LinkContents&lt;/em&gt;. Sembra tutto fatto, ma ecco l'amara sorpresa che ho trovato compilando il tutto:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Error 1 Error 3032: Problem in Mapping Fragment starting at line 49: Condition member 'BaseContents.Type' with a condition other than 'IsNull=False' is mapped. Either remove the condition on BaseContents.Type or remove it from the mapping.&lt;/strong&gt; &lt;p&gt;Scopro che &lt;em&gt;Type&lt;/em&gt; crea un problema. Il mio primo tentativo di cancellazione di questa property dall'&lt;em&gt;entity&lt;/em&gt; &lt;em&gt;BaseContents&lt;/em&gt; mi porta un nuovo errore: &lt;p&gt;&lt;strong&gt;Error 1 Error 3023: Problem in Mapping Fragments starting at lines 48, 54, 59: Column BaseContents.Type has no default value and is not nullable. A column value is required to store entity data.&lt;br /&gt;An Entity with Key (PK) will not round-trip when:&lt;br /&gt; (PK is in 'BaseContents' EntitySet AND Entity is type TestEntitiesModel.BaseContents)&lt;/strong&gt; &lt;p&gt;Alla fine scopro la soluzione da un &lt;a href="http://weblogs.asp.net/zeeshanhirani/archive/2008/08/16/single-table-inheritance-in-entity-framework.aspx"&gt;blog&lt;/a&gt; di &lt;a href="http://weblogs.asp.net/zeeshanhirani/default.aspx"&gt;Zeeshan Hirani&lt;/a&gt; (che spiega il tutto in modo molto più dettagliato, ma visto che ho scritto fino a qua, non ho voglia di buttare il tutto) che ringrazio perché mi ha fatto trovare immediatamente la soluzione. E' sufficiente modificare la &lt;em&gt;property&lt;/em&gt; &lt;em&gt;Abstract&lt;/em&gt; dell&lt;em&gt;'Entity BaseContents&lt;/em&gt; in &lt;em&gt;true&lt;/em&gt;, per eliminare ogni errore. &lt;p&gt;Ora da codice possiamo inserire e leggere da questa tabella con due &lt;em&gt;entity&lt;/em&gt; separate: &lt;p&gt;&lt;em&gt;using (TestEntitiesModel.TestEntitiesEntities context = new TestEntitiesModel.TestEntitiesEntities())&lt;br /&gt;{&lt;br /&gt; TestEntitiesModel.TextContents c = new TestEntitiesModel.TextContents();&lt;br /&gt; c.Name = "Example 1";&lt;br /&gt; c.Content = "Content text bla bla bla";&lt;br /&gt; context.AddToBaseContents(c);&lt;br /&gt; TestEntitiesModel.LinkContents l = new TestEntitiesModel.LinkContents();&lt;br /&gt; l.Name = "Example 2";&lt;br /&gt; l.Link = "www.aspitalia.com";&lt;br /&gt; l.Impressions = 0;&lt;br /&gt; context.AddToBaseContents(l);&lt;br /&gt; context.SaveChanges();&lt;br /&gt;} &lt;/em&gt; &lt;p&gt;Visualizzando il contenuto della tabella troveremo:&lt;/p&gt; &lt;table cellspacing="0" cellpadding="2" width="510" border="1" unselectable="on"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td  width="66"&gt;I&lt;strong&gt;d&lt;/strong&gt;&lt;/td&gt; &lt;td  width="66"&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/td&gt; &lt;td  width="66"&gt;&lt;strong&gt;Link&lt;/strong&gt;&lt;/td&gt; &lt;td  width="66"&gt;&lt;strong&gt;Impressions&lt;/strong&gt;&lt;/td&gt; &lt;td  width="66"&gt;&lt;strong&gt;Content&lt;/strong&gt;&lt;/td&gt; &lt;td  width="66"&gt;&lt;strong&gt;Type&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td  width="66"&gt;1&lt;/td&gt; &lt;td  width="66"&gt;Example1&lt;/td&gt; &lt;td  width="66"&gt;&lt;em&gt;null&lt;/em&gt;&lt;/td&gt; &lt;td  width="66"&gt;&lt;em&gt;null&lt;/em&gt;&lt;/td&gt; &lt;td  width="66"&gt;Content text bla bla bla&lt;/td&gt; &lt;td  width="66"&gt;1&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td  width="66"&gt;2&lt;/td&gt; &lt;td  width="66"&gt;Example2&lt;/td&gt; &lt;td  width="66"&gt;www.aspitalia.com&lt;/td&gt; &lt;td  width="66"&gt;1&lt;/td&gt; &lt;td  width="66"&gt;&lt;em&gt;null&lt;/em&gt;&lt;/td&gt; &lt;td  width="66"&gt;2&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;Per leggere:&lt;/p&gt; &lt;p&gt;&lt;em&gt;using (TestEntitiesModel.TestEntitiesEntities context = new TestEntitiesModel.TestEntitiesEntities())&lt;br /&gt;{&lt;br /&gt; var coll = from c in context.BaseContents.OfType&amp;lt;TestEntitiesModel.TextContents&amp;gt;()&lt;br /&gt; orderby c.Content ascending&lt;br /&gt; select c;&lt;br /&gt; foreach (var item in coll)&lt;br /&gt; {&lt;br /&gt; Response.Write(string.Format("{0} {1} {2}&amp;lt;br /&amp;gt;",&lt;br /&gt; item.Id,item.Name,item.Content));&lt;br /&gt; }&lt;br /&gt;} &lt;/em&gt;&lt;/p&gt; &lt;p&gt;Questa volta per specificare l'&lt;em&gt;entity&lt;/em&gt; da leggere, dobbiamo utilizzare l'&lt;em&gt;OfType&lt;/em&gt; come da esempio. Se volessimo richiedere l'&lt;em&gt;entity&lt;/em&gt; &lt;em&gt;LinkContents&lt;/em&gt;, avremmo duvuto scrivere:&lt;/p&gt;&lt;em&gt; var coll = from c in context.BaseContents.OfType&amp;lt;TestEntitiesModel.&lt;strong&gt;Link&lt;/strong&gt;Contents&amp;gt;()&lt;/em&gt;&lt;br /&gt; &lt;p&gt;Oltre al &lt;em&gt;Table Per Hierarchy (Single Table Inheritance)&lt;/em&gt; l'&lt;em&gt;EntityFramework&lt;/em&gt; mette a disposizione altri due tipi di &lt;em&gt;inheritance&lt;/em&gt;:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;em&gt;Table Per Type&lt;/em&gt; &lt;li&gt;&lt;em&gt;Table Per Concrete Class&lt;/em&gt; &lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Ma le cosa iniziano a complicarsi un po' con l'editor di VS2008.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/Visual_Studio/" rel="tag"&gt;Visual Studio&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET, Visual Studio</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2377/Entity-Framework-Ereditarieta-Single-Table-Inheritance.aspx</guid><slash:comments>2</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2377/Entity-Framework-Ereditarieta-Single-Table-Inheritance.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2377.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2377</trackback:ping></item><item><title>Abusi della parola chiave var e poca leggibilit&amp;#224; dei generics</title><link>http://blogs.aspitalia.com/ricciolo/post2376/Abusi-Parola-Chiave-Var-Leggibilita-Generics.aspx</link><pubDate>Fri, 29 Aug 2008 11:07:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2376' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Con &lt;strong&gt;C# 3.0&lt;/strong&gt; hanno introdotto la nuova parola chiave var per inferire il tipo dalla dichiarazione il cui scopo è principalmente supportare e rendere possibile &lt;strong&gt;LINQ&lt;/strong&gt;. Un po' di codice ormai in giro si trova, ma trovo che a volte questa parola chiave venga abusata.&lt;/p&gt;&lt;p&gt;Sono del parere che non debba essere strumento della nostra pigrizia, ma che venga usata sapientemente. Oltre alle situazioni in cui l'uso è d'obbligo, dove l'assegnazione restituisce un &lt;strong&gt;anonymous type&lt;/strong&gt;, credo var possa essere usato in assegnazioni complesse, solitamente dovute ai generics. Per esempio&lt;/p&gt;&lt;p&gt;&lt;code&gt;var people = new Dictionary&lt;city, /&gt;&amp;gt;();&lt;br /&gt;var f = new Func&amp;lt;String, Func&amp;lt;Int32, DateTime&amp;gt;&amp;gt;(miaFunzione);&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Non lo userei invece, ma dichiarerei il tipo, per quando l'espressione è semplice e il tipo è ben conosciuto:&lt;/p&gt;&lt;p&gt;&lt;code&gt;var s = &amp;quot;ciao&amp;quot;;&lt;br /&gt;var exists = (from c in people&lt;br /&gt;where c.City == &amp;quot;Brescia&lt;br /&gt;select true).FirstOrDefault();&lt;br /&gt;var c = people.Count;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;I motivi sono due:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;se vedo il codice non capisco che tipo sono. Nemmeno l'intellisense te lo segnala finchè non lo usi almeno una volta e non sempre guardo codice da Visual Studio;&lt;/li&gt;&lt;li&gt;perdo un po' di controllo sui tipi. Se il metodo o la proprietà cambiano, il significato dell'assegnazione cambia e il codice potrebbe comunque compilare, ma funzionare diversamente. Inoltre, dove posso, preferisco lavorare a livello di interfacce o classi base, perciò specificare il tipo è d'obbligo.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Inoltre un'osservazione sulla leggibilità del codice. Personalmente le assegnazioni, dove secondo me è giustificato usare la var, non piacciono molto. Sono un po' incasinate, non trovate? Se è una variabile di stack in effetti può andare bene così, ma se poi questo tipo lo si restituisce credo sia più appropriato a questo punto fare una classe apposita che ne semplifica l'utilizzo. Ad esempio:&lt;/p&gt;&lt;p&gt;&lt;code&gt;public class Cities : Dictionary&amp;lt;ZipCodes&amp;gt;&lt;city, /&gt; { }&lt;br /&gt;public class ZipCodes : List&amp;lt;ZipCode&amp;gt;&lt;zipcode /&gt; { }&lt;br /&gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Non dimentichiamoci infine che esistono gli alias che trovo molto comodo quando uso delegate complessi, anche per uso interno, perché di fatto non creano nuove classi o membri. Per esempio:&lt;/p&gt;&lt;p&gt;&lt;code&gt;using MioInvoker = new Func&amp;lt;String, Func&amp;lt;Int32, DateTime&amp;gt;&amp;gt;;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Ovviamente questa è una mia opinione stilistica personale, infatti l'ho scritta nel mio blog :-)&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_3.5/" rel="tag"&gt;.NET Framework 3.5&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/LINQ/" rel="tag"&gt;LINQ&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Object_Oriented_Programming/" rel="tag"&gt;Object Oriented Programming&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Cristian "Ricciolo" Civera</dc:creator><category>.NET 3.5, .NET Framework, .NET Framework 3.5, LINQ, Object Oriented Programming</category><guid isPermaLink="true">http://blogs.aspitalia.com/ricciolo/post2376/Abusi-Parola-Chiave-Var-Leggibilita-Generics.aspx</guid><slash:comments>13</slash:comments><wfw:comments>http://blogs.aspitalia.com/ricciolo/post2376/Abusi-Parola-Chiave-Var-Leggibilita-Generics.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/ricciolo/CommentRSS2376.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2376</trackback:ping></item><item><title>Il mio primo libro in inglese: Entity Framework In Action</title><link>http://blogs.aspitalia.com/sm15455/post2375/Libro-Inglese-Entity-Framework-Action.aspx</link><pubDate>Thu, 28 Aug 2008 10:12:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2375' border="0" style="width:1px; height:1px;" /&gt;Sono mesi che ci sto lavorando e finalmente il risutato si vede. Ormai tutto è pronto quindi posso annunciare che dopo &lt;a href="http://books.aspitalia.com/ASP.NET-3.5/"&gt;ASP.NET 3.5 per tutti&lt;/a&gt;, partirò con la stesura del mio primo libro da &amp;quot;single&amp;quot; in inglese: Entity Framework In Action.&lt;br /&gt;&lt;br /&gt;Come si intuisce dal titolo, il libro è pubblicato dalla &lt;a target="_blank" href="http://www.manning.com"&gt;Manning&lt;/a&gt;. Molti mi hanno sconsigliato di scrivere un libro su questo argomento vista la grande impopolarità di Entity Framework. Io rimango della mia idea che seppur limitato da alcune scelte di design, che verranno in parte migliorate nella v2, questo framework ha un engine molto potente ed in futuro dirà la sua contro colossi come NHibernate (visto anche che è incluso nel framework). &lt;br /&gt;&lt;br /&gt;Confesso di essere un tantinello terrorizzato perchè scrivere un libro in inglese che verrà letto in tutto il mondo è una cosa non proprio semplice da affrontare, ma ormai come mi ha detto &lt;a href="http://blogs.aspitalia.com/daniele"&gt;Daniele&lt;/a&gt; &amp;quot;hai voluto la bicicletta ...&amp;quot; :).&lt;br /&gt;&lt;br /&gt;Chiudo con i ringraziamenti d'obbligo ad &lt;a target="_blank" href="http://aspadvice.com/blogs/garbin/"&gt;Alessandro&lt;/a&gt;, lui sa benissimo il perché.  Ora non mi rimane che buttarmi a capofitto nella stesura del libro, sperando di riuscire a convincere la gente che in realtà Entity Framework non è così malaccio come si dice :).&lt;br /&gt;&lt;br /&gt;Stay Tuned...&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_3.5/" rel="tag"&gt;.NET Framework 3.5&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ADO.NET_Entity_Framework/" rel="tag"&gt;ADO.NET Entity Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/LINQ/" rel="tag"&gt;LINQ&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ORM/" rel="tag"&gt;ORM&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Stefano Mostarda</dc:creator><category>Entity Framework In Action, .NET Framework, .NET Framework 3.5, ADO.NET Entity Framework, LINQ, ORM</category><guid isPermaLink="true">http://blogs.aspitalia.com/sm15455/post2375/Libro-Inglese-Entity-Framework-Action.aspx</guid><slash:comments>9</slash:comments><wfw:comments>http://blogs.aspitalia.com/sm15455/post2375/Libro-Inglese-Entity-Framework-Action.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/SM15455/CommentRSS2375.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2375</trackback:ping></item><item><title>L'entity Framework e i vincoli FOREIGN KEY</title><link>http://blogs.aspitalia.com/az/post2374/Lentity-Framework-Vincoli-FOREIGN-KEY.aspx</link><pubDate>Thu, 28 Aug 2008 07:12:13 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2374' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;L'&lt;em&gt;entity framework&lt;/em&gt; rende felice. Ti fa vedere il mondo dei database sotto un'altra ottica. Le complicazioni create dai soliti esperti di struttura dei database fanno ora sorridere, anzi, li si incita a complicare maggiormente la struttura delle tabella per normalizzazioni fino al quinto livello.&lt;/p&gt; &lt;p&gt;-&lt;em&gt; Il terzo livello basta! &lt;br /&gt;&lt;/em&gt;- &lt;em&gt;No, andiamo fino al quinti livello di normalizzazione!&lt;/em&gt; - possono ora affermare i &lt;em&gt;dev &lt;/em&gt;sorseggiando un caff&amp;#232; alle loro spalle.&lt;/p&gt; &lt;p&gt;A parte queste &lt;em&gt;ciance&lt;/em&gt;, una delle attenzioni che si devono avere quando si usa l'&lt;em&gt;Entity Framework&lt;/em&gt; &amp;#232; quando si cancellano delle &lt;em&gt;entity&lt;/em&gt; dal database quando sono in gioco &lt;em&gt;Foreign key&lt;/em&gt; e amenit&amp;#224; simili. Inoltre, la cancellazione di una entit&amp;#224; non elimina - giustamente - di suo eventuali propriet&amp;#224; collegate uno-a-uno con un'altra tabella (sempre che sul db non ci siano regole varie, ma in questo caso di deve prestare attenzione, perch&amp;#233; la cache interna dell'&lt;em&gt;Entity Framework&lt;/em&gt; la vedr&amp;#224; ancora presente). Buona regola, nel caso di voler cancellare tutti i record coinvolti in una entit&amp;#224;, scrivere:&lt;/p&gt; &lt;p&gt;&lt;em&gt;using (pubsModel.pubsEntities2 context = new pubsModel.pubsEntities2()) &lt;br /&gt;{ &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; var padre = context.Canc_Padre.Include(&amp;quot;Canc_Figlia&amp;quot;).First(); &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; var figlia = padre.Canc_Figlia; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; context.DeleteObject(figlia); &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; context.DeleteObject(padre); &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; context.SaveChanges(); &lt;br /&gt;} &lt;/em&gt;&lt;/p&gt; &lt;p&gt;In questo caso le tabelle di chiamano &lt;em&gt;Canc&lt;/em&gt;_&lt;em&gt;Padre&lt;/em&gt; e &lt;em&gt;Canc&lt;/em&gt;_&lt;em&gt;Figlia&lt;/em&gt;. L'ordine di cancellazione dev'essere anche quello mostrato (prima la tabella figlia e poi la padre), perch&amp;#233; la cancellazione dell'entit&amp;#224; padre farebbe perdere il collegamento con il record da cancellare con la necessit&amp;#224; di una nuova query di &lt;em&gt;select&lt;/em&gt; di ricerca. &lt;/p&gt; &lt;p&gt;Ma nel caso delle relazioni molti-a-molti? Prendiamo d'esempio un classico schema con tre tabelle: &lt;/p&gt; &lt;ol&gt; &lt;li&gt;authors &lt;/li&gt; &lt;li&gt;books &lt;/li&gt; &lt;li&gt;authorsbooks&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;Le prime due sono le classiche tabelle che conterranno i dati, la terza quella che collega i dati delle due.&lt;/p&gt; &lt;p&gt;Scrivendo questo codice:&lt;/p&gt; &lt;p&gt;&lt;em&gt;using (pubsModel.pubsEntities2 context = new pubsModel.pubsEntities2()) &lt;br /&gt;{ &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; var coll = (from au in context.authors &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; where au.name==&amp;quot;...&amp;quot; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; select au).First(); &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; context.DeleteObject(coll); &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; context.SaveChanges(); &lt;br /&gt;} &lt;/em&gt;&lt;/p&gt; &lt;p&gt;Otterremo il classico errore:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;L'istruzione DELETE &amp;#232; in conflitto con il vincolo REFERENCE &amp;quot;FK_authors_books_authors&amp;quot;. Il conflitto si &amp;#232; verificato nella tabella &amp;quot;dbo.authorsbooks&amp;quot;, column 'id_author' del database &amp;quot;pubs&amp;quot;.&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Per evitare questo problema, cio&amp;#232; cancellare il record dalla tabella &lt;em&gt;authors&lt;/em&gt; e ogni suo riferimento dalla tabella &lt;em&gt;authorsbooks&lt;/em&gt;, dovremo invece scrivere:&lt;/p&gt; &lt;em&gt;using (pubsModel.pubsEntities2 context = new pubsModel.pubsEntities2()) &lt;br /&gt;{ &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; var coll = (from au in context.authors.&lt;strong&gt;Include(&amp;quot;books&amp;quot;)&lt;/strong&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; where au.name==&amp;quot;...&amp;quot; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; select au).First(); &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; context.DeleteObject(coll); &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; context.SaveChanges(); &lt;br /&gt;} &lt;/em&gt; &lt;p&gt;Se volessimo cancellare anche il record in &lt;em&gt;book&lt;/em&gt;, dovremo fare come sopra: recuperata l'&lt;em&gt;entity&lt;/em&gt; usare il &lt;em&gt;DeleteObject&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;PS: ieri sera ho dovuto aspettare venti minuti il pullman per tornare a casa.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/Database/" rel="tag"&gt;Database&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET, Database</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2374/Lentity-Framework-Vincoli-FOREIGN-KEY.aspx</guid><slash:comments>6</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2374/Lentity-Framework-Vincoli-FOREIGN-KEY.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2374.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2374</trackback:ping></item><item><title>Data Service Viewer</title><link>http://blogs.aspitalia.com/az/post2373/Data-Service-Viewer.aspx</link><pubDate>Thu, 28 Aug 2008 07:09:20 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2373' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Interessante questo &lt;a title="link esterno" href="http://weblogs.asp.net/vardi/archive/2008/08/27/ado-net-data-services-viewer-tool.aspx"&gt;tool&lt;/a&gt;. Anche se &lt;a title="link esterno" href="http://astoria.mslivelabs.com/"&gt;Astoria&lt;/a&gt; &amp;#232; una tecnologia che mi mette parecchi dubbi (dubbi che non voglio per ora divulgare qui) la trovo interessante. E se c'&amp;#232; un tool che permette di provare le richieste http in modo facile e che ti d&amp;#224; anche una mano, ben venga.&lt;/p&gt; &lt;p&gt;E' un exe scritto in .net. Alla prima richiesta richiede l'endpoint dove astoria &amp;#232; in attesa, per esempio:&lt;/p&gt; &lt;p&gt;&lt;a href="http://localhost:1035/websiteentity2/webdataservice.svc"&gt;http://localhost:1035/WebSiteEntity2/WebDataService.svc&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Nel codice di questo &lt;em&gt;ado.net web data service&lt;/em&gt;, &amp;#232; necessario obbligare quali entit&amp;#224; possono essere utilizzate e come:&lt;/p&gt; &lt;p&gt;&lt;em&gt;public class WebDataService : DataService&amp;lt;pubsModel.pubsEntities2&amp;gt; &lt;br /&gt;{ &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public static void InitializeService(IDataServiceConfiguration config) &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; { &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; config.SetEntitySetAccessRule(&amp;quot;*&amp;quot;, EntitySetRights.All); &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; config.SetServiceOperationAccessRule(&amp;quot;*&amp;quot;, ServiceOperationRights.All); &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;br /&gt;}&lt;/em&gt; &lt;/p&gt; &lt;p&gt;Qui ho specificato che &amp;#232; possibile operare su tutte le entit&amp;#224; e che posso farci di tutto tra queste scelte possibili.&lt;/p&gt; &lt;p&gt;Ok, avviata la web application con questo nuovo oggetto, possiamo utilizzare il tool prima citato che il nome significativo &amp;quot;Data service viewer&amp;quot;. Inserito l'endpoint, ecco la schermata:&lt;/p&gt; &lt;p&gt;&lt;img height="459" alt="data service viewer" src="http://blogs.aspitalia.com/img/andrewz/dataserviceviewer_80c0/immagine%202_3.gif" width="524" border="0" /&gt; &lt;/p&gt; &lt;p&gt;Ma l'utilit&amp;#224; vera &amp;#232; nella possibilit&amp;#224; di provare le query avendo il supporto per l'intellisense durante la scrittura:&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.aspitalia.com/img/andrewz/dataserviceviewer_80c0/immagine%201_2.gif"&gt;&lt;img height="388" alt="data service viewer" src="http://blogs.aspitalia.com/img/andrewz/dataserviceviewer_80c0/immagine%201_thumb.gif" width="523" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Qui si scopre un piccolo problema. L'elenco delle scelte possibile &amp;#232; selezionabile con i tasti cursore e la scelta &amp;#232; selezionabile solo con il tasto invio e con il mouse mentre il tasto tab manda al pulsante per l'esecuzione della query.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>Software</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2373/Data-Service-Viewer.aspx</guid><slash:comments>0</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2373/Data-Service-Viewer.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2373.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2373</trackback:ping></item><item><title>Lazy Loading con l'Entity Framework</title><link>http://blogs.aspitalia.com/az/post2372/Lazy-Loading-Entity-Framework.aspx</link><pubDate>Wed, 27 Aug 2008 11:33:57 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2372' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Anche se qualcuno afferma il contrario, non cito la fonte, abbiamo a disposizione pi&amp;#249; metodi per caricare entit&amp;#224; collegate. In tutti questi post dedicati all'&lt;em&gt;Entity Framework&lt;/em&gt; ho fatto sempre esempio che riguardavano pi&amp;#249; tabelle (~entit&amp;#224;) collegate.&lt;/p&gt; &lt;p&gt;Possiamo fare in modo che sia lo stesso &lt;em&gt;Entity Framework&lt;/em&gt; a caricare con una query il tutto grazie a Include:&lt;/p&gt; &lt;p&gt;&lt;em&gt;var coll=from c in EntityContext.Articles.Include(&amp;quot;Authors&amp;quot;) &lt;br /&gt;select c; &lt;br /&gt;foreach (var item in coll) &lt;br /&gt;{ &lt;br /&gt;Response.Write(item.Title); &lt;br /&gt;Response.Write(item.Authors.Name); &lt;br /&gt;}&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Oppure possiamo forzare il caricamente delle entit&amp;#224; collegate, in questo caso &lt;em&gt;Authors&lt;/em&gt;, ad ogni richiesta della stessa:&lt;/p&gt; &lt;p&gt;&lt;em&gt;var coll=from c in EntityContext.Articles &lt;br /&gt;select c; &lt;br /&gt;foreach (var item in coll) &lt;br /&gt;{ &lt;br /&gt;Response.Write(item.Title); &lt;br /&gt;if (item.AuthorsReference.IsLoaded) // Controlla se gi&amp;#224; presente in memoria &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Response.Write(item.AuthorsReference.Value.Name); &lt;br /&gt;else &lt;br /&gt;{ &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; item.AuthorsReference.Load(); &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Response.Write(item.Authors.Name); &lt;br /&gt;} &lt;br /&gt;}&lt;/em&gt;&lt;/p&gt; &lt;p&gt;In quest'ultimo caso all'inizio viene eseguita una query che richiede solo la lista degli &lt;em&gt;Articles&lt;/em&gt;. Quindi viene verificato che l'entit&amp;#224; per gli &lt;em&gt;Authors&lt;/em&gt; non sia gi&amp;#224; presente in memoria; se presente la visualizza direttamente, altrimenti esegue una query al database.&lt;/p&gt; &lt;p&gt;Il numero di query inviate al database &amp;#232; N+(numero di autori richiesti differenti). Ipoteticamente, se tutti gli articoli fossero collegati ad un solo autore, il numero di query inviate al database sarebbero due.&lt;/p&gt; &lt;p&gt;PS: scusate la brevit&amp;#224; ma il tempo &amp;#232; tiranno. O Tir&lt;em&gt;&amp;#224;&lt;/em&gt;no?&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2372/Lazy-Loading-Entity-Framework.aspx</guid><slash:comments>6</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2372/Lazy-Loading-Entity-Framework.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2372.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2372</trackback:ping></item><item><title>4 desktop virtuali su Windows</title><link>http://blogs.aspitalia.com/az/post2371/Desktop-Virtuali-Windows.aspx</link><pubDate>Tue, 26 Aug 2008 12:01:02 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2371' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Una peculiarit&amp;#224; che ho sempre apprezzato nei desktop manager di Linux &amp;#232; la possibilit&amp;#224; di dividere la zona di lavoro su pi&amp;#249; desktop virtuali. &lt;a title="link esterno" href="http://blogs.dotnethell.it/windowsvista/post_14028.aspx"&gt;Leggo&lt;/a&gt; ora che &amp;#232; presente questo &lt;a title="link esterno" href="http://technet.microsoft.com/en-us/sysinternals/cc817881.aspx"&gt;tool&lt;/a&gt; che lo permette anche su Windows. Scaricato e avviato. Funziona discretamente, ed &amp;#232; veloce e &lt;em&gt;pesa&lt;/em&gt; poco. Il problema &amp;#232; un altro: non permette i passaggi di finestre tra un desktop all'altro con la stessa facilit&amp;#224; che permette Gnome o Kde: vengono s&amp;#236; create pi&amp;#249; arie di lavoro, ma queste non sembrano poter comunicare.&lt;/p&gt; &lt;p&gt;Peccato.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>Software</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2371/Desktop-Virtuali-Windows.aspx</guid><slash:comments>12</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2371/Desktop-Virtuali-Windows.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2371.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2371</trackback:ping></item><item><title>A volte ritornano... GridView vs Repeater vs ListView vs Custom</title><link>http://blogs.aspitalia.com/az/post2370/Volte-Ritornano.-GridView-Repeater-ListView-Custom.aspx</link><pubDate>Tue, 26 Aug 2008 07:20:37 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2370' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;&lt;a href="http://blogs.aspitalia.com/az/post549/ancora-prestazioni-datagrid-datalist-repeater-.aspx"&gt;Sono passati anni&lt;/a&gt;? Parecchio tempo fa avevo confrontato le prestazioni nel binding dei dati tra i pi&amp;#249; noti webcontrol. Ecco un refresh, questa volta con il Framework 3.5 e con lo scontro tra:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Gridview &lt;/li&gt; &lt;li&gt;Repeater &lt;/li&gt; &lt;li&gt;ListView &lt;/li&gt; &lt;li&gt;Custom code&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Chiunque un po' smaliziato con il .net sapr&amp;#224; gi&amp;#224; chi vince e chi &amp;#232; il peggiore tra questi. Ma per i novizi &amp;#232; sempre meglio saperlo. Innanzitutto, il codice per il popolamento delle tabelle html &amp;#232; il seguente:&lt;/p&gt; &lt;p&gt;&lt;em&gt;List&amp;lt;Person&amp;gt; p; &lt;br /&gt;p = new List&amp;lt;Person&amp;gt;(200); &lt;br /&gt;for (int i = 0; i &amp;lt; 200; i++) &lt;br /&gt;&amp;#160; p.Add(new Person { Id=i, Age=i, Description=&amp;quot;Desc &amp;quot;+i.ToString(), Name=&amp;quot;Name &amp;quot;+i.ToString() }); &lt;/em&gt;&lt;/p&gt; &lt;p&gt;Il &lt;em&gt;gridview&lt;/em&gt; crea la table html con questo codice:&lt;/p&gt; &lt;p&gt;&lt;em&gt;&amp;lt;asp:GridView ID=&amp;quot;gw1&amp;quot; EnableViewState=&amp;quot;false&amp;quot; runat=&amp;quot;server&amp;quot; AutoGenerateColumns=&amp;quot;false&amp;quot;&amp;gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Columns&amp;gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;asp:BoundField DataField=&amp;quot;id&amp;quot; /&amp;gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;asp:BoundField DataField=&amp;quot;name&amp;quot; /&amp;gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;asp:BoundField DataField=&amp;quot;age&amp;quot; /&amp;gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;asp:BoundField DataField=&amp;quot;description&amp;quot; /&amp;gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Columns&amp;gt; &lt;br /&gt;&amp;lt;/asp:GridView&amp;gt; &lt;/em&gt;&lt;/p&gt; &lt;p&gt;Per il &lt;em&gt;repeater&lt;/em&gt; abbiamo: &lt;/p&gt; &lt;p&gt;&lt;em&gt;&amp;lt;asp:Repeater ID=&amp;quot;rp1&amp;quot; runat=&amp;quot;server&amp;quot; EnableViewState=&amp;quot;false&amp;quot;&amp;gt; &lt;br /&gt;&amp;lt;HeaderTemplate&amp;gt;&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;/HeaderTemplate&amp;gt; &lt;br /&gt;&amp;lt;FooterTemplate&amp;gt;&amp;lt;/table&amp;gt;&amp;lt;/FooterTemplate&amp;gt; &lt;br /&gt;&amp;lt;ItemTemplate&amp;gt; &lt;br /&gt;&amp;lt;tr&amp;gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;td&amp;gt;&amp;lt;%# Eval(&amp;quot;id&amp;quot;) %&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;td&amp;gt;&amp;lt;%# Eval(&amp;quot;name&amp;quot;) %&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;td&amp;gt;&amp;lt;%# Eval(&amp;quot;age&amp;quot;) %&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;td&amp;gt;&amp;lt;%# Eval(&amp;quot;description&amp;quot;) %&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;&amp;lt;/tr&amp;gt; &lt;br /&gt;&amp;lt;/ItemTemplate&amp;gt; &lt;br /&gt;&amp;lt;/asp:Repeater&amp;gt; &lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;M&lt;/em&gt;a siccome vogliamo ottimizzare un po', possiamo scrivere: &lt;/p&gt; &lt;p&gt;&lt;em&gt;&amp;lt;tr&amp;gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;td&amp;gt;&amp;lt;%# ((Person)Container.DataItem).Id %&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;td&amp;gt;&amp;lt;%# ((Person)Container.DataItem).Name %&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;td&amp;gt;&amp;lt;%# ((Person)Container.DataItem).Age %&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;td&amp;gt;&amp;lt;%# ((Person)Container.DataItem).Description %&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;&amp;lt;/tr&amp;gt; &lt;/em&gt;&lt;/p&gt; &lt;p&gt;Ecco il &lt;em&gt;ListView&lt;/em&gt;, semplice: &lt;/p&gt; &lt;p&gt;&lt;em&gt;&amp;lt;asp:ListView ID=&amp;quot;lw1&amp;quot; runat=&amp;quot;server&amp;quot; EnableViewState=&amp;quot;false&amp;quot;&amp;gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;LayoutTemplate&amp;gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;asp:Panel ID=&amp;quot;itemPlaceholder&amp;quot; runat=&amp;quot;server&amp;quot; /&amp;gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/table&amp;gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/LayoutTemplate&amp;gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ItemTemplate&amp;gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;tr&amp;gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;td&amp;gt;&amp;lt;%# Eval(&amp;quot;id&amp;quot;) %&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;td&amp;gt;&amp;lt;%# Eval(&amp;quot;name&amp;quot;) %&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;td&amp;gt;&amp;lt;%# Eval(&amp;quot;age&amp;quot;) %&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;td&amp;gt;&amp;lt;%# Eval(&amp;quot;description&amp;quot;) %&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/tr&amp;gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/ItemTemplate&amp;gt; &lt;br /&gt;&amp;lt;/asp:ListView&amp;gt;&lt;/em&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;E ottimizzato: &lt;/p&gt; &lt;p&gt;&lt;em&gt;&amp;lt;ItemTemplate&amp;gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;tr&amp;gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;td&amp;gt;&amp;lt;%# ((Person)Container.DataItem).Id %&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;td&amp;gt;&amp;lt;%# ((Person)Container.DataItem).Name %&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;td&amp;gt;&amp;lt;%# ((Person)Container.DataItem).Age %&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;td&amp;gt;&amp;lt;%# ((Person)Container.DataItem).Description %&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/tr&amp;gt; &lt;br /&gt;&amp;lt;/ItemTemplate&amp;gt; &lt;/em&gt;&lt;/p&gt; &lt;p&gt;E infine creiamo la griglia da codice con un banale &lt;em&gt;StringBuilder&lt;/em&gt; da codice: &lt;/p&gt; &lt;p&gt;&lt;em&gt;var sb = new StringBuilder(10000); &lt;br /&gt;sb.Append(&amp;quot;&amp;lt;table border='1'&amp;gt;&amp;quot;); &lt;br /&gt;for (int i = 0; i &amp;lt; p.Count; i++) &lt;br /&gt;{ &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; sb.Append(&amp;quot;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot;); &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; sb.Append(p[i].Id); &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; sb.Append(&amp;quot;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;quot;); &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; sb.Append(p[i].Name); &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; sb.Append(&amp;quot;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;quot;); &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; sb.Append(p[i].Age); &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; sb.Append(&amp;quot;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;quot;); &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; sb.Append(p[i].Description); &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; sb.Append(&amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;); &lt;br /&gt;} &lt;br /&gt;sb.Append(&amp;quot;&amp;lt;/table&amp;gt;&amp;quot;); &lt;br /&gt;pn1.Controls.Add(new LiteralControl(sb.ToString())); &lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;pn1&lt;/em&gt; &amp;#232; un &lt;em&gt;panel&lt;/em&gt;. Ma vediamo le prestazioni (medie): &lt;/p&gt; &lt;table cellspacing="0" cellpadding="2" width="400" border="1"&gt;&lt;tbody&gt; &lt;tr&gt; &lt;td  width="200"&gt;&lt;em&gt;&lt;strong&gt;GridView&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt; &lt;td  width="200"&gt;&lt;strong&gt;&lt;em&gt;0.122s&lt;/em&gt;&lt;/strong&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td  width="200"&gt;&lt;em&gt;&lt;strong&gt;Repeater&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt; &lt;td  width="200"&gt;&lt;em&gt;&lt;strong&gt;0.058s&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td  width="200"&gt;&lt;em&gt;&lt;strong&gt;Repeater ottimizzato&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt; &lt;td  width="200"&gt;&lt;em&gt;&lt;strong&gt;0.046s&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td  width="200"&gt;&lt;em&gt;&lt;strong&gt;ListView&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt; &lt;td  width="200"&gt;&lt;em&gt;&lt;strong&gt;0.059s&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td  width="200"&gt;&lt;em&gt;&lt;strong&gt;ListView ottimizzato&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt; &lt;td  width="200"&gt;&lt;em&gt;&lt;strong&gt;0.047s&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td  width="200"&gt;&lt;em&gt;&lt;strong&gt;Custom code&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt; &lt;td  width="200"&gt;&lt;em&gt;&lt;strong&gt;0.006s&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;A parte la tabella scritta con lo &lt;em&gt;StringBuilder&lt;/em&gt; che mediamente risulta otto volte pi&amp;#249; veloce del &lt;em&gt;ListView&lt;/em&gt; e del &lt;em&gt;Repeater&lt;/em&gt;, la sorpresa &amp;#232; proprio il &lt;em&gt;ListView&lt;/em&gt; che risulta veloce quanto il &lt;em&gt;Repeater&lt;/em&gt;. In poche parole? Il &lt;em&gt;DataGrid&lt;/em&gt;, &lt;em&gt;DataList&lt;/em&gt;, &lt;em&gt;DataGrid&lt;/em&gt; e &lt;em&gt;Repeater&lt;/em&gt; sono diventati obsoleti e inutili dato il &lt;em&gt;ListView&lt;/em&gt; non solo sostituisce in tutto questi webcontrol, ma ha prestazioni pi&amp;#249; che buone.&amp;#160;&amp;#160; &lt;/p&gt; &lt;p&gt;Inoltre, per avere un discreto guadagno, anche la visualizzazione con il &lt;em&gt;casting&lt;/em&gt; di tipo nella colonna, invece dell'&lt;em&gt;Eval&lt;/em&gt;, &amp;#232; consigliato.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/ASP.NET/" rel="tag"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET_2.0/" rel="tag"&gt;ASP.NET 2.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET_3.5/" rel="tag"&gt;ASP.NET 3.5&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Databinding/" rel="tag"&gt;Databinding&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Datagrid/" rel="tag"&gt;Datagrid&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/GridView/" rel="tag"&gt;GridView&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET, ASP.NET, ASP.NET 2.0, ASP.NET 3.5, Databinding, Datagrid, GridView</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2370/Volte-Ritornano.-GridView-Repeater-ListView-Custom.aspx</guid><slash:comments>18</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2370/Volte-Ritornano.-GridView-Repeater-ListView-Custom.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2370.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2370</trackback:ping></item><item><title>L'Entity Framework e l'ObjectDataSource</title><link>http://blogs.aspitalia.com/az/post2369/LEntity-Framework-ObjectDataSource.aspx</link><pubDate>Sun, 24 Aug 2008 19:26:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2369' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Anche se con l'SP1 del Framework 3.5 è stato introdotto il nuovo &lt;em&gt;EntityDataSource&lt;/em&gt; per collegare direttamente questi nuovi oggetti a web control come il &lt;em&gt;ListView&lt;/em&gt; o il &lt;em&gt;GridView&lt;/em&gt;, l'utilizzo dell'&lt;em&gt;ObjectDataSource&lt;/em&gt; rimane sempre la soluzione migliore: come dice &lt;a href="http://blogs.aspitalia.com/daniele"&gt;Daniele&lt;/a&gt;, i &lt;em&gt;datasource&lt;/em&gt; come l'&lt;em&gt;SqlDataSource&lt;/em&gt; e compagnia bella sono solo veramente utili per le demo.&lt;/p&gt;&lt;p&gt;Di base non ci sono problemi. Solo di base però. Quando si cerca di fare qualcosa di più complesso saltano sempre fuori casini vari. Messo nella pagina un &lt;em&gt;ListView&lt;/em&gt; collegato ad un bel &lt;em&gt;ObjectDataSource&lt;/em&gt; che utilizza una classe apposita che ritorna le entità (nel mio caso con l'ausilio dell'&lt;em&gt;Entity Framework&lt;/em&gt;) non ci sono problemi: persino altre entità memorizzate in proprietà vengono visualizzate correttamente. Come nell'esempio già &lt;a href="http://blogs.aspitalia.com/az/post2361/entity-framework-sql-generato.aspx"&gt;visto&lt;/a&gt;:&lt;/p&gt;&lt;p&gt;&lt;img alt="gridview" src="http://blogs.aspitalia.com/img/andrewz/entityframeworkelsqlgenerato_adf2/image_1.png" /&gt; &lt;/p&gt;&lt;p&gt;I problemi nascono quando entrano in gioco gli update e gli insert. Come scritto sopra, di base, cioè con proprietà con tipi non complessi, non ci sono problemi. Definendo nell'&lt;em&gt;InsertMethod&lt;/em&gt; dell'&lt;em&gt;ObjectDataSource&lt;/em&gt; una nostra funzione come la seguente, tutto funziona:&lt;/p&gt;&lt;p&gt;&lt;em&gt;[System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Insert)]&lt;br /&gt;public static void InsertAuthor(Author author)&lt;br /&gt;{&lt;br /&gt;using (TestEntitiesModel.TestEntitiesCode context = new TestEntitiesModel.TestEntitiesCode())&lt;br /&gt;{&lt;br /&gt;context.addAuthors(author);&lt;br /&gt;context.SaveChanges();&lt;br /&gt;} &lt;br /&gt;}&lt;/em&gt; &lt;/p&gt;&lt;p&gt;Che bello! Eh sì, ma l'entità qui trattata ha anche come proprietà la collection di &lt;em&gt;Book&lt;/em&gt; collegati all'autore secondo il seguente schema: &lt;/p&gt;&lt;p&gt;&lt;img alt="entity framework" src="http://blogs.aspitalia.com/img/andrewz/sqlserver2008evisualstudio2008sp1_10f47/image_6.png" /&gt; &lt;/p&gt;&lt;p&gt;Per visualizzare il tutto in modalità &lt;em&gt;edit&lt;/em&gt; si incotrano le prime rogne ma risolvibile. Ma cosa viene passato al metodo &lt;em&gt;InsertAuthor&lt;/em&gt; prima mostrato? Tutto, tranne, ovviamente, eventuli aggiunte ai &lt;em&gt;book&lt;/em&gt;. Qui l'esempio è un po' forzato, ma un caso reale potrebbe essere la creazione di un nuovo utente e il collegamento ad esso di una o più role per autorizzazione varie (visualizzate in modalità &lt;em&gt;edit&lt;/em&gt; come lista con &lt;em&gt;checkbox&lt;/em&gt;). &lt;/p&gt;&lt;p&gt;Come inviare il tutto in modo corretto a quella funzione o quasi? &lt;/p&gt;&lt;p&gt;Io ho solo trovato un espediente, ma spero ci siano soluzioni più semplici che finora mi sono sfuggite. Utilizzando l'evento &lt;em&gt;On_ItemInserting&lt;/em&gt; dell'&lt;em&gt;ListView&lt;/em&gt; possiamo forza l'aggiunta di tutte le informazioni utili: &lt;/p&gt;&lt;p&gt;&lt;em&gt;protected void lw_authors_ItemInserting(object sender, ListViewInsertEventArgs e)&lt;br /&gt;{&lt;br /&gt;// In Values troviamo tutti i valori letti dal objectdatasource (BoundColumn, Bind, ecc...)&lt;br /&gt;// Inserisce un campo aggiuntivo perla data presente nel db ma non del ListView&lt;br /&gt;e.Values.Add(&amp;quot;CreationData&amp;quot;, DateTime.Now);&lt;br /&gt;var books = new System.Data.Objects.DataClasses.EntityCollection&lt;book /&gt;();&lt;br /&gt;// Metodi che richiedono le entità da collegare&lt;br /&gt;books.Add( AZ.GetBookFromId(1) );&lt;br /&gt;books.Add( AZ.GetBookFromId(2) );&lt;br /&gt;e.Values.Add(&amp;quot;Books&amp;quot;, auths);&lt;br /&gt;} &lt;/em&gt;&lt;/p&gt;&lt;p&gt;Innanzitutto, l'&lt;em&gt;objectdatasource&lt;/em&gt; espone la connection come &lt;em&gt;EntityConnection&lt;/em&gt;, quindi perché possa essere riconosciuta dobbiamo inserire tutti gli item selezionati in questa collection. Sembra tutto ok, in questo modo all'evento di inserimento &lt;em&gt;dovrebbe&lt;/em&gt; essere passato il tutto correttamente. Dovrebbe! Richiamato questo codice si ha come output un errore chiarissimo in merito proprio al momento dell'&lt;em&gt;Add&lt;/em&gt;:&lt;/p&gt;&lt;p&gt;&lt;i&gt;&lt;strong&gt;The object could not be added to the EntityCollection or EntityReference. An object that is attached to an ObjectContext cannot be added to an EntityCollection or EntityReference that is not associated with a source object.&lt;/strong&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;Allora ecco l'&lt;em&gt;escamotage&lt;/em&gt;:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;protected void lw_users_ItemInserting(object sender, ListViewInsertEventArgs e)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp;...&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var books = new System.Data.Objects.DataClasses.EntityCollection&amp;lt;Book&amp;gt;();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; books.Add(new&amp;nbsp;Book { Id = 1 });&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; books.Add(new&amp;nbsp;Book { Id = 2 });&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.Values.Add("Books", auths);&lt;br&gt;} &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Creo due nuove classi &lt;em&gt;Book&lt;/em&gt; dove inserisco gli &lt;em&gt;Id&lt;/em&gt; dei valori selezionati nell'interfaccia grafica (qui inseriti da codice per rendere il tutto più semplice). Ora il codice per l'inserimento dovrebbe accettare anche questi dati aggiuntivi, ma ecco il secondo problema della giornata: quelle entità verrebbero trattate come nuovi oggetti e inseriti nuovamente nel database. Ecco dunque l'ultima modifica al codice, questa volta nella funzione di inserimento:&lt;/p&gt;&lt;em&gt;[System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Insert)]&lt;br&gt;public static void InsertAuthor(Author author)&lt;br&gt;{&lt;br&gt;&amp;nbsp;using (TestEntitiesModel.TestEntitiesCode context = new TestEntitiesModel.TestEntitiesCode())&lt;br&gt;&amp;nbsp;{&lt;br&gt;&amp;nbsp; var coll = user.Books.Select(r =&amp;gt; r.Id).ToArray&amp;lt;int&amp;gt;();&lt;br&gt;&amp;nbsp; user.Books.Clear();&lt;br&gt;&amp;nbsp; foreach (var item in coll)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; user.Books.Add( context.Books.Where( r=&amp;gt;r.Id==item ).FirstOrDefault() );&lt;br&gt;&amp;nbsp; // Oppure&lt;br&gt;&amp;nbsp; // foreach (var item in coll)&lt;br&gt;&amp;nbsp;&amp;nbsp;//&amp;nbsp; user.Books.Add(&amp;nbsp;context.GetObjectbyKey( item ) );&lt;br&gt;&amp;nbsp;&amp;nbsp;context.addAuthors(author);&lt;br&gt;&amp;nbsp; context.SaveChanges();&lt;br&gt;&amp;nbsp;} &lt;br&gt;}&lt;/em&gt; 
&lt;p&gt;E tutto funziona correttamente. Ma spero ci siano soluzioni più immediate e semplici. Vero? Ditemi di sì! :(&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2369/LEntity-Framework-ObjectDataSource.aspx</guid><slash:comments>15</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2369/LEntity-Framework-ObjectDataSource.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2369.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2369</trackback:ping></item></channel></rss>