<?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/az/</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 'Caesar' 2008.11.17</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/az/</link></image><item><title>Modificare i PDF</title><link>http://blogs.aspitalia.com/az/post2429/Modificare-PDF.aspx</link><pubDate>Sun, 09 Nov 2008 09:40:19 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2429' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Prima o poi chiunque si trova di fronte a questo problemino (!?!?). Una soluzione veloce veloce free è grazie ad una extension per &lt;em&gt;OpenOffice&lt;/em&gt;: &lt;a title="link esterno" href="http://extensions.services.openoffice.org/project/pdfimport"&gt;Sun PDF Import Extension&lt;/a&gt;. Scaricato e installato dal menu &lt;em&gt;Strumenti&lt;/em&gt; e &lt;em&gt;Gestione estensioni&lt;/em&gt;, ci permette di aprire in scrittura i documenti &lt;em&gt;PDF&lt;/em&gt; ed effettuare delle modifiche. &lt;em&gt;Delle&lt;/em&gt; modifiche perché non permette di rivoluzionare la struttura di un documento. Da miei piccoli test mi sono trovato più volte il testo di un paragrafo separato per righe, quindi con difficoltà nelle correzioni e unione dello stesso.&lt;/p&gt; &lt;p&gt;Però è comodo. Anche nelle fredde ma assolate domeniche mattina.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/Office/" rel="tag"&gt;Office&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, Office</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2429/Modificare-PDF.aspx</guid><slash:comments>0</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2429/Modificare-PDF.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2429.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2429</trackback:ping></item><item><title>Mono e Framework... un po' di semplici benchmark</title><link>http://blogs.aspitalia.com/az/post2419/Mono-Framework.-Podi-Semplici-Benchmark.aspx</link><pubDate>Tue, 28 Oct 2008 08:29:50 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2419' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;&lt;em&gt;&amp;quot;Ma prestazionalmente, sulla stessa macchina, quant'&amp;#232; la differenza tra un'applicazione che gira sul Framework e sistema operativo Microsoft e la stessa su Linux con Mono?&amp;quot;&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Questa era una richiesta che mi era stata fatta parecchio tempo fa, ma per questione di voglia o altro non l'avevo mai fatta. Allora ho scritto una semplice &lt;em&gt;windows forms&lt;/em&gt; che facesse delle operazioni ripetute su questi semplici scenari:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Calcolo con interi: banale calcolo con soli numeri interi.&lt;/li&gt; &lt;li&gt;Calcolo con decimal: come sopra, ma con l'uso dei decimali.&lt;/li&gt; &lt;li&gt;Lettura completa di un documento &lt;em&gt;xml&lt;/em&gt; da 300KB e 44.000 nodi, con il &lt;em&gt;SelectNodes&lt;/em&gt;, nodo per nodo.&lt;/li&gt; &lt;li&gt;Apertura ripetuta dello stesso documento &lt;em&gt;xml&lt;/em&gt; ripetutamente con ricerca di nodi all'interno dello stesso.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Innanzitutto vediamo l'applicazione in esecuzione:&lt;/p&gt; &lt;p&gt;&lt;img height="402" alt="schermata-benchmark .net2" src="http://blogs.aspitalia.com/img/andrewz/monoeframework.unpodisemplicibenchmark_8355/schermata-benchmark%20.net2_3.png" width="385" border="0" /&gt; &lt;/p&gt; &lt;p&gt;E su Linux con Mono:&lt;/p&gt; &lt;p&gt;&lt;img height="427" alt="schermata-benchmark .net mono" src="http://blogs.aspitalia.com/img/andrewz/monoeframework.unpodisemplicibenchmark_8355/schermata-benchmark%20.net_3.png" width="387" border="0" /&gt; &lt;/p&gt; &lt;p&gt;Riassumendo i risultati in una tabella:&lt;/p&gt; &lt;table cellspacing="0" cellpadding="2" width="400" border="0"&gt;&lt;tbody&gt; &lt;tr&gt; &lt;td  width="80"&gt;&amp;#160;&lt;/td&gt; &lt;td  width="80"&gt;&lt;strong&gt;Integer&lt;/strong&gt;&lt;/td&gt; &lt;td  width="80"&gt;&lt;strong&gt;Double&lt;/strong&gt;&lt;/td&gt; &lt;td  width="80"&gt;&lt;strong&gt;Xml 1&lt;/strong&gt;&lt;/td&gt; &lt;td  width="80"&gt;&lt;strong&gt;Xml 2&lt;/strong&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td  width="80"&gt;&lt;em&gt;&lt;strong&gt;Windows .net&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt; &lt;td  width="80"&gt;&lt;em&gt;453,125s&lt;/em&gt;&lt;/td&gt; &lt;td  width="80"&gt;&lt;em&gt;1859,375s&lt;/em&gt;&lt;/td&gt; &lt;td  width="80"&gt;&lt;em&gt;46,875s&lt;/em&gt;&lt;/td&gt; &lt;td  width="80"&gt;&lt;em&gt;4640,625s&lt;/em&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td  width="80"&gt;&lt;em&gt;&lt;strong&gt;Mono&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt; &lt;td  width="80"&gt;&lt;em&gt;499,71s&lt;/em&gt;&lt;/td&gt; &lt;td  width="80"&gt;&lt;em&gt;2362.398s&lt;/em&gt;&lt;/td&gt; &lt;td  width="80"&gt;&lt;em&gt;259,891s&lt;/em&gt;&lt;/td&gt; &lt;td  width="80"&gt;&lt;em&gt;26959,493s&lt;/em&gt;&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;NB:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;La piccola applicazione &amp;#232; stata scritta con &lt;em&gt;Visual Studio 2008&lt;/em&gt; per il&lt;em&gt; Framework 2.0&lt;/em&gt;.&lt;/li&gt; &lt;li&gt;Il computer su cui girava &lt;em&gt;Mono&lt;/em&gt; aveva &lt;em&gt;Ubuntu&lt;/em&gt; 8.10 RC.&lt;/li&gt; &lt;li&gt;Ho potuto usare solo la versione 1.9 di &lt;em&gt;Mono&lt;/em&gt; e non la nuova 2.0, ma purtroppo non potevo testare la nuova versione sul computer a disposizione.&lt;/li&gt; &lt;li&gt;Notare le piccole imperfezioni grafiche della versione &lt;em&gt;Mono&lt;/em&gt;, teoricamente risolte con la nuova versione.&lt;/li&gt; &lt;/ol&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/Mono/" rel="tag"&gt;Mono&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>Mono, .NET Framework</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2419/Mono-Framework.-Podi-Semplici-Benchmark.aspx</guid><slash:comments>0</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2419/Mono-Framework.-Podi-Semplici-Benchmark.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2419.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2419</trackback:ping></item><item><title>GTK, giusta crocevia tra piattaforme?</title><link>http://blogs.aspitalia.com/az/post2414/GTK-Giusta-Crocevia-Piattaforme.aspx</link><pubDate>Sun, 26 Oct 2008 12:57:50 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2414' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Non ho mai fatto segreto della mia passione per &lt;em&gt;&lt;a title="link esterno" href="http://it.wikipedia.org/wiki/mono_(progetto)"&gt;Mono&lt;/a&gt;&lt;/em&gt;, porting del &lt;em&gt;Framework .Net&lt;/em&gt; su sistemi operativi non &lt;em&gt;Microsoft&lt;/em&gt;. Passi da gigante sono stati fatti per la compatibilità delle stesse applicazioni su sistemi operativi differenti, soprattutto per applicazioni desktop (sono fondamentalmente contro all'utilizzo di questo porting per webapplication, visto che il risparmio dovuto ad hosting e licenze dei sistemi operativi sia ridicolo di fronte allo sforzo per la realizzazione di web application che girino perfettamente con Mono - ma questo è assolutamente IMHO!).&lt;/p&gt; &lt;p&gt;Da qualche giorno è uscita la versione 2.0 di &lt;a title="link esterno" href="http://www.mono-project.com/main_page"&gt;&lt;em&gt;Mono&lt;/em&gt;&lt;/a&gt;. E' aumentata notevolmente la compatibilità con le applicazini scritte con il Framework nativo della &lt;em&gt;Microsoft&lt;/em&gt;. Ora è possibile lanciare moltissime applicazioni &lt;em&gt;windows forms&lt;/em&gt; su &lt;em&gt;Linux&lt;/em&gt; con &lt;em&gt;Mono&lt;/em&gt; senza trovare grosse differenze e problematiche nell'uso dell'interfaccia grafica (cosa che avveniva in modo pesante con la versione 1.2 e, in modo minore, con la 1.9.1).&lt;/p&gt; &lt;p&gt;Nel poco tempo che riesco a dedicare a &lt;em&gt;Mono&lt;/em&gt; per miei test, ho trovato ideale l'utilizzo di una libreria esterna per la creazione e l'utilizzo delle interfacce grafiche, compatibile con entrambi i mondi, Windows e Linux. E' il progetto &lt;a title="link esterno" href="http://www.mono-project.com/gtksharp"&gt;Gtk#&lt;/a&gt;, libreria che permette l'utilizzo di &lt;a title="link esterno" href="http://www.gtk.org/"&gt;Gtk+&lt;/a&gt; che, ricordo, è la libreria grafica utilizzata dal &lt;em&gt;Desktop environment&lt;/em&gt;, &lt;em&gt;Gnome&lt;/em&gt;. Inoltre è utilizzata già con successo da molti altri programmi multi piattaforma, come &lt;em&gt;&lt;a title="link esterno" href="http://www.pidgin.im/"&gt;Pidgin&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;Il suo utilizzo in applicazioni .&lt;em&gt;Net&lt;/em&gt; su sistemi operativi &lt;em&gt;Linux&lt;/em&gt; non necessita di alcuno sforzo visto che nel caso di &lt;em&gt;Gnome&lt;/em&gt; è già installata la libreria &lt;em&gt;Gtk&lt;/em&gt;, nel caso di altri &lt;em&gt;Desktop environment&lt;/em&gt; - &lt;em&gt;Kde&lt;/em&gt; - è sufficiente installare tale libreria. Installazione necessaria anche sotto &lt;em&gt;Windows&lt;/em&gt; da questo &lt;a title="link esterno" href="http://gladewin32.sourceforge.net/"&gt;link&lt;/a&gt; da dove si devono scaricare sia la libreria &lt;em&gt;Gtk+&lt;/em&gt;, sia &lt;em&gt;Glade&lt;/em&gt;, e infine la &lt;a title="link esterno" href="http://developer.novell.com/wiki/index.php/special:downloads/gtk-sharp/gtk-sharp~~~runtime"&gt;Gtk#&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;La costruzione dell'interfacce grafica è semplice, grazie a programmi appositi, come &lt;em&gt;Glade&lt;/em&gt; (programma scaricato prima), che permette la creazione di interfacce grafiche in modo molto simile a &lt;em&gt;Visual Studio&lt;/em&gt;. L'output di questo programma è un &lt;em&gt;xml&lt;/em&gt; che, incluso nel nostro progetto con &lt;em&gt;Visual Studio&lt;/em&gt; definito come "&lt;em&gt;Embedded Resource&lt;/em&gt;" utilizzeremo in questo modo:&lt;/p&gt; &lt;p&gt;&lt;em&gt;public GtkApp(string []args)&lt;br /&gt; {&lt;br /&gt; Application.Init(); &lt;br /&gt; Glade.XML gxml = new Glade.XML (null, "googleSearch.googlesearch.glade", &lt;br /&gt; "mainWindow", null);&lt;br /&gt; gxml.Autoconnect (this);&lt;br /&gt; mainWindow.DeleteEvent+=new DeleteEventHandler(mainWindow_DeleteEvent);&lt;br /&gt; btnSearch.Clicked+=new EventHandler(btnSearch_Clicked);&lt;br /&gt; btnClear.Clicked+=new EventHandler(btnClear_Clicked);&lt;br /&gt; Application.Run();&lt;br /&gt; }&lt;/em&gt; &lt;p&gt;Un esempio completo (da cui ho preso questa porzione di codice) lo si trova in questa pagina di &lt;em&gt;&lt;a title="link esterno" href="http://www.codeproject.com/kb/cross-platform/googlesearch.aspx"&gt;CodeProject&lt;/a&gt;&lt;/em&gt;. Dopo aver caricato l'interfaccia grafica si connette da codice gli eventi agli oggetti come i button all'interno dell'interfaccia grafica. Tutto fatto.&lt;/p&gt; &lt;p&gt;Abbiamo a disposizione altre interfacce grafiche comuni tra i sistemi operativi, come la famosa libreria &lt;em&gt;&lt;a title="link esterno" href="http://www.wxwidgets.org/"&gt;wxwidgets&lt;/a&gt;&lt;/em&gt; e il suo porting in &lt;em&gt;.Net&lt;/em&gt;, &lt;em&gt;&lt;a title="link esterno" href="http://wxnet.sourceforge.net/"&gt;wxwidgets.net&lt;/a&gt;&lt;/em&gt;. Potente flessibile, ma ha grossi problemi di stabilità almeno sotto &lt;em&gt;windows&lt;/em&gt; dove &lt;strong&gt;crolla&lt;/strong&gt; spesso e volentieri in errori inspiegabili - almeno per me.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/Mono/" rel="tag"&gt;Mono&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>Mono</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2414/GTK-Giusta-Crocevia-Piattaforme.aspx</guid><slash:comments>0</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2414/GTK-Giusta-Crocevia-Piattaforme.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2414.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2414</trackback:ping></item><item><title>Excel e i formati aperti</title><link>http://blogs.aspitalia.com/az/post2413/Excel-Formati-Aperti.aspx</link><pubDate>Sat, 25 Oct 2008 12:00:18 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2413' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Questa settimana ho dovuto lavorare parecchio con &lt;em&gt;Excel&lt;/em&gt;. Ma non nella costruzione di fogli con il programma &lt;em&gt;Excel&lt;/em&gt; per inserire le formulette o per creare grafici, ma per la sua gestione &lt;strong&gt;dal di fuori&lt;/strong&gt; con codice .Net in un ameno &lt;em&gt;CRUD&lt;/em&gt; - è applicabile anche fuori dal mondo dei db questo acronimo? Non sono un purista delle terminologia e dunque non me ne frega nulla.&lt;/p&gt; &lt;p&gt;Vediamo un po' le risorse a nostra disposizione senza componenti da installare su un server per leggere e scrivere nel formato .xls di &lt;em&gt;Excel&lt;/em&gt;. Innanzitutto partiamo dalla creazione. Abbiamo tre grosse e facili strade:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Tabella html.&lt;/li&gt; &lt;li&gt;Xml&lt;/li&gt; &lt;li&gt;Oledb&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;La prima strada è la più semplice ma assolutamente non permette alcuna configurazione. In poche parole scordiamoci l'inserimento di formule e formattazioni strane. Il contenuto della tabella sarà importata così com'è, nulla di più, nulla di meno.&lt;/p&gt; &lt;p&gt;L'xml si può dividere in due categorie: quello contenente solo i dati di &lt;em&gt;Excel&lt;/em&gt; e quello che rappresenta sia i dati sia la formattazione. Nel primo caso non abbiamo niente di differente dalla tabella html prima citata, mentre nel secondo caso abbiamo pressocché tutte le potenzialità di &lt;em&gt;Excel&lt;/em&gt; a disposizione: formattazione, formule, &lt;em&gt;multi-sheet&lt;/em&gt; e così via... L'unica limitazione che ho trovato è nell'impossibilità di bloccare con password gli elementi presenti nel documento. Questo formato è molto semplice. Per poterlo vedere è sufficiente salvare un qualsiasi documento &lt;em&gt;Excel&lt;/em&gt; in formato &lt;em&gt;Xml&lt;/em&gt; e aprirlo con un qualsiasi editor:&lt;/p&gt; &lt;p&gt;&lt;em&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;?mso-application progid="Excel.Sheet"?&amp;gt;&lt;br /&gt;&amp;lt;Workbook xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet"&lt;br /&gt; xmlns:html="&lt;/em&gt;&lt;a href="http://www.w3.org/tr/rec-html40&amp;quot;"&gt;&lt;em&gt;http://www.w3.org/TR/REC-html40"&lt;/em&gt;&lt;/a&gt;&lt;br /&gt;&lt;em&gt; xmlns:o="urn:schemas-microsoft-com:office:office"&lt;br /&gt; xmlns:xsi="&lt;/em&gt;&lt;a href="http://www.w3.org/2001/xmlschema-instance&amp;quot;"&gt;&lt;em&gt;http://www.w3.org/2001/XMLSchema-instance"&lt;/em&gt;&lt;/a&gt;&lt;br /&gt;&lt;em&gt; xmlns="urn:schemas-microsoft-com:office:spreadsheet"&lt;br /&gt; xmlns:x2="&lt;/em&gt;&lt;a href="http://schemas.microsoft.com/office/excel/2003/xml&amp;quot;"&gt;&lt;em&gt;http://schemas.microsoft.com/office/excel/2003/xml"&lt;/em&gt;&lt;/a&gt;&lt;br /&gt;&lt;em&gt; xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"&lt;br /&gt; xmlns:x="urn:schemas-microsoft-com:office:excel"&amp;gt;&lt;br /&gt; &amp;lt;OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office"&amp;gt;&lt;br /&gt; &amp;lt;Colors&amp;gt;&lt;br /&gt; &amp;lt;Color&amp;gt;&lt;br /&gt; ...&lt;br /&gt; &amp;lt;/Color&amp;gt;&lt;br /&gt; &amp;lt;/Colors&amp;gt;&lt;br /&gt; &amp;lt;/OfficeDocumentSettings&amp;gt;&lt;br /&gt; &amp;lt;ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"&amp;gt;&lt;br /&gt; ...&lt;br /&gt; &amp;lt;/ExcelWorkbook&amp;gt;&lt;br /&gt; &amp;lt;Styles&amp;gt;&lt;br /&gt; &amp;lt;Style ss:ID="Default" ss:Name="Default"/&amp;gt;...&lt;br /&gt; &amp;lt;/Styles&amp;gt;&lt;br /&gt; &amp;lt;ss:Worksheet ss:Name="Foglio1"&amp;gt;&lt;br /&gt; &amp;lt;Table ss:StyleID="ta1"&amp;gt;&amp;lt;Column ss:Width="64.2614"/&amp;gt;&amp;lt;Row ss:Height="12.8409"&amp;gt;&amp;lt;Cell&amp;gt;&amp;lt;Data ss:Type="String"&amp;gt;Titolo&amp;lt;/Data&amp;gt;&amp;lt;/Cell&amp;gt;&amp;lt;/Row&amp;gt;&amp;lt;Row ss:Height="12.8409"&amp;gt;&amp;lt;Cell&amp;gt;&amp;lt;Data ss:Type="Number"&amp;gt;12&amp;lt;/Data&amp;gt;&amp;lt;/Cell&amp;gt;&amp;lt;/Row&amp;gt;&amp;lt;Row ss:Height="12.8409"&amp;gt;&amp;lt;Cell&amp;gt;&amp;lt;Data ss:Type="Number"&amp;gt;32&amp;lt;/Data&amp;gt;&amp;lt;/Cell&amp;gt;&amp;lt;/Row&amp;gt;&amp;lt;Row ss:Height="12.8409"&amp;gt;&amp;lt;Cell&amp;gt;&amp;lt;Data ss:Type="Number"&amp;gt;43&amp;lt;/Data&amp;gt;&amp;lt;/Cell&amp;gt;&amp;lt;/Row&amp;gt;&amp;lt;Row ss:Height="12.8409"&amp;gt;&amp;lt;Cell ss:Formula="of:=SUM([.A2:.A4])"&amp;gt;&amp;lt;Data ss:Type="Number"&amp;gt;87&amp;lt;/Data&amp;gt;&amp;lt;/Cell&amp;gt;&amp;lt;/Row&amp;gt;&amp;lt;/Table&amp;gt;&amp;lt;x:WorksheetOptions/&amp;gt;&lt;br /&gt; &amp;lt;/ss:Worksheet&amp;gt;&lt;br /&gt; &amp;lt;ss:Worksheet ss:Name="Foglio2"&amp;gt;&lt;br /&gt; &amp;lt;Table ss:StyleID="ta1"&amp;gt;&amp;lt;Column ss:Width="64.2614"/&amp;gt;&amp;lt;Row ss:Height="12.8409"&amp;gt;&amp;lt;Cell ss:Index="1"/&amp;gt;&amp;lt;/Row&amp;gt;&amp;lt;/Table&amp;gt;&amp;lt;x:WorksheetOptions/&amp;gt;&lt;br /&gt; &amp;lt;/ss:Worksheet&amp;gt;&lt;br /&gt; &amp;lt;ss:Worksheet ss:Name="Foglio3"&amp;gt;&lt;br /&gt; &amp;lt;Table ss:StyleID="ta1"&amp;gt;&amp;lt;Column ss:Width="64.2614"/&amp;gt;&amp;lt;Row ss:Height="12.8409"&amp;gt;&amp;lt;Cell ss:Index="1"/&amp;gt;&amp;lt;/Row&amp;gt;&amp;lt;/Table&amp;gt;&amp;lt;x:WorksheetOptions/&amp;gt;&lt;br /&gt; &amp;lt;/ss:Worksheet&amp;gt;&lt;br /&gt;&amp;lt;/Workbook&amp;gt;&lt;/em&gt; &lt;p&gt;L'ultima tecnica a disposizione è grazie all'uso dell'&lt;em&gt;oledb&lt;/em&gt;. Proprio come fosse un database, possiamo creare un foglio di &lt;em&gt;excel&lt;/em&gt;, i singoli fogli e il contenuto tabellare. E' sufficiente usare una stringa di connessione come la seguente per accedere in lettura o, se non esiste, per creare un documento &lt;em&gt;Excel&lt;/em&gt;:&lt;/p&gt; &lt;p&gt;&lt;em&gt;string conn="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Document.xls;Extended Properties = \"Excel 8.0;HDR=YES;\"";&lt;/em&gt; &lt;p&gt;Per leggere si usano i soliti comando &lt;em&gt;sql-like&lt;/em&gt;: &lt;p&gt;&lt;em&gt;select * from [Sheet1$]&lt;/em&gt; &lt;p&gt;Così anche per l'inserimento: &lt;p&gt;&lt;em&gt;inert into [Sheet1$](NomeColonna1,NomeColonna2) values(1,2)&lt;/em&gt; &lt;p&gt;Per creare un nuovo &lt;em&gt;sheet&lt;/em&gt;: &lt;p&gt;&lt;em&gt;create table [AZFoglio](Colonna1 int, Colonna2 text)&lt;/em&gt; &lt;p&gt;Il problema è la cancellazione di un &lt;em&gt;sheet&lt;/em&gt;. Questo comando non elimina lo &lt;em&gt;sheet&lt;/em&gt; dal documento, ma semplicemente lo svuota: &lt;p&gt;&lt;em&gt;drop table [AZFoglio]&lt;/em&gt; &lt;p&gt;Altra nota negativa non di poco conto? La cancellazione di righe non è supportata! &lt;p&gt;Inoltre, tutti gli &lt;em&gt;sheet&lt;/em&gt; creati all'interno di &lt;em&gt;Excel&lt;/em&gt; avranno il simbolo del dollaro in automatico alla fine del nome (importante saperlo perché il simbolo è necessario per le query in &lt;em&gt;oledb&lt;/em&gt;), mentre quelli creati da &lt;em&gt;Oledb&lt;/em&gt;, non sarà necessario. &lt;p&gt;Molto comodo questo tipo di accesso, ma ci mette subito di fronte all'impossibilità di inserire alcunché al di fuori di dati tabellari. Inoltre, l'&lt;em&gt;Oledb&lt;/em&gt; ha un modo particolare per capire il tipo di dato presente in una colonna in un documento &lt;em&gt;Excel&lt;/em&gt;: legge le prime otto righe per ogni colonna, e da un media tutta sua, valuta il tipo che sarà contenuto. Questo cosa comporta? Semplice, un macello se prepariamo un documento &lt;em&gt;Excel&lt;/em&gt; contenente solo il nome delle colonne e senza alcun dato perché popolata dal nostro codice. Il perché? Intuibile. &lt;em&gt;Oledb&lt;/em&gt; vedendo solo il nome di colonna - una stringa - penserà che il tipo è di tipo &lt;em&gt;text&lt;/em&gt;. &lt;p&gt;Altro grave problema. Se il classico operatore che non sa distinguere &lt;em&gt;Excel&lt;/em&gt; da un tostapane, inserisce i dati come numeri e poi testo, il tipo non corrispondente a quello calcolato dalla media all'apertura del documento, sarà ignorato. &lt;p&gt;Visto che sono saltato a piè pari alla lettura, qualsiasi persona potrebbe pensare di creare il documento &lt;em&gt;Excel&lt;/em&gt; in formato &lt;em&gt;Xml&lt;/em&gt; e poi leggerlo con &lt;em&gt;Oledb&lt;/em&gt;... MAGARI! No, non è possibile. &lt;em&gt;Oledb&lt;/em&gt; è in grado di accedere ai documenti &lt;em&gt;Excel&lt;/em&gt; salvati nel suo formato originale. Bel casino. E per leggere un documento &lt;em&gt;Excel&lt;/em&gt; salvato in formato &lt;em&gt;Xml&lt;/em&gt;? Semplice, si usa il classo &lt;em&gt;XmlDocument&lt;/em&gt; o classi simili! E sempre per aggiungere righe, modificare colonne e altro, ci si deve affidare a oggetti adatti alla trattazione di documenti &lt;em&gt;Xml&lt;/em&gt;. &lt;p&gt;In rete sono disponibili vari oggetti per la lettura/scrittura di documenti Excel. Per esempio: &lt;ul&gt; &lt;li&gt;&lt;a title="link esterno" href="http://www.codeproject.com/kb/office/excelreader.aspx"&gt;ExcelReader&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a title="link esterno" href="http://www.carlosag.net/tools/excelxmlwriter/"&gt;CarlosAg Excel Xml Writer Library&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Il primo è in grado di leggere in modo perfetto (bel superiore all'&lt;em&gt;Oledb&lt;/em&gt;) qualsiasi documento salvato in formato &lt;em&gt;Excel&lt;/em&gt;, ma non documenti creati in &lt;em&gt;Xml&lt;/em&gt;. La seconda classe crea un documento Excel in modo molto semplice e intuitivo, ma solo in formato &lt;em&gt;Xml&lt;/em&gt;. Uomo avvisato...&lt;/p&gt; &lt;p&gt;Ma dopo tutto questo personale chiacchiericcio, qual è la morale? Innanzitutto ho voluto darei posteri questa mia esperienza in modo che altri possano perdere meno tempo in test come ho fatto io, e poi... Quando si butteranno via i formati proprietari di &lt;em&gt;Excel,&lt;/em&gt; &lt;em&gt;Word&lt;/em&gt; e - perché no? - &lt;em&gt;Pdf&lt;/em&gt;, e non si usano definitivamente quelli aperti come quello di &lt;em&gt;Office 2007&lt;/em&gt; o di &lt;em&gt;OpenOffice&lt;/em&gt;? E pensare come sarebbe bello! La fine dell'utilizzo di oggetti esterni e carissimi per gestire questi formati, basta installazioni di oggetti &lt;em&gt;COM&lt;/em&gt; per la loro trattazione.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Questo è uno sfogo personale!&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;E non centra nulla con il fatto che oggi è il Linux Day. A proposito, sui miei computer ecco i sistemi operativi che uso:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Windows 2003 (in attesa di essere sostituito da &lt;em&gt;Windows&lt;/em&gt; &lt;em&gt;2008&lt;/em&gt; appena avrò una nuova macchina, i miei due &lt;em&gt;SO&lt;/em&gt; preferiti made in &lt;em&gt;Microsoft&lt;/em&gt;).&lt;/li&gt; &lt;li&gt;Arch Linux (la mia distribuzione &lt;em&gt;Linux&lt;/em&gt; preferita).&lt;/li&gt; &lt;li&gt;Windows Xp SP3 (affidabilissimo anche sul quel mio catenaccio di portatile).&lt;/li&gt; &lt;li&gt;Ubuntu 8.4 (riesce a farmi funzionare tutto sul portatile).&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/Office/" rel="tag"&gt;Office&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>Imho, Office</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2413/Excel-Formati-Aperti.aspx</guid><slash:comments>0</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2413/Excel-Formati-Aperti.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2413.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2413</trackback:ping></item><item><title>Io... e il mio tempo</title><link>http://blogs.aspitalia.com/az/post2408/Io.-Tempo.aspx</link><pubDate>Sat, 18 Oct 2008 12:58:06 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2408' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Sarà... avrà ragione la gente. Mi dicono che ho un caratteraccio. Qualcuno si stupisce di certi miei comportamenti. Eppure a me sembra chiaro. Vivo con il costrutto &lt;em&gt;vivi e lascia vivere...&lt;/em&gt; Ma quello che non sopporto sono quelli che pensano di sapere i fatti degli altri, di avere titolo per elargire buoni consigli. Ma che ne sai di quello che penso, faccio, desidero e odio? Io accetto le critiche, ma da persone che &lt;em&gt;sanno chi sono&lt;/em&gt; e &lt;em&gt;che mi conoscono.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Faccio un esempio altrimenti non vengo capito. Prendiamo questa &lt;a href="http://blogs.msdn.com/scoriani/archive/2008/10/18/storie-di-successo-con-nhibernate.aspx"&gt;critica&lt;/a&gt; mossa su un mio &lt;a href="http://blogs.aspitalia.com/az/post2404/podi-benchmark-linq-entity-framework-nhibernate.aspx"&gt;blog&lt;/a&gt; precedente. Mi chiedo: costui che titolo ha di criticare ciò che scrivo il quel suo blog stantio alla ricerca del solito sensazionalismo, aggiungendo in coda la seguente frase?&lt;/p&gt; &lt;p&gt;&lt;em&gt;PS per la serie.. c'è gente che ha tanto tempo da &lt;/em&gt;&lt;a href="http://blogs.aspitalia.com/az/post2404/podi-benchmark-linq-entity-framework-nhibernate.aspx"&gt;&lt;em&gt;perdere&lt;/em&gt;&lt;/a&gt;&lt;em&gt; in cose veramente poco utili e obiettive.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Così come io ho fatto dei test e ho dimostrato alcune cose, secondo me utili e motivate, mi piacerebbe che anche tu facessi lo stesso nei miei confronti, in modo che possa capire, se e dove, ho sbagliato nelle mie considerazioni. Ti ricordo inoltre che i prodotti, di qualsiasi azienda non solo di Microsoft, conquistano il mercato e si impogono, non tanto perchè c'è un Evangelist qualsiasi (che ho sempre considerato figura tecnica e non markettaro) che sostiene velatamente, "che i nostri prodotti sono i migliori e gli altri fanno schifo" ma perchè sono effettivamente, concretamente e oggettivamente migliori di altri. Sarebbe troppo facile se tutti i clienti abboccassero così all'amo. &lt;p&gt;P.S.&lt;br /&gt;Io non sono obbiettivo e dico cose poco utili? Un evangelist Microsoft dice a me che non sono obbiettivo? Era una battuta, vero?&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>Andrea Zani</dc:creator><category>Imho, Off Topic</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2408/Io.-Tempo.aspx</guid><slash:comments>5</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2408/Io.-Tempo.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2408.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2408</trackback:ping></item><item><title>BackgroundWorker e le windows forms</title><link>http://blogs.aspitalia.com/az/post2407/BackgroundWorker-Windows-Forms.aspx</link><pubDate>Fri, 17 Oct 2008 06:54:18 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2407' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Apprezzo moltissimo questo oggetto introdotto nella versione 2.0 del framework quando devo scrivere delle windows forms tradizionali con il Framework. Chi ha esperienza di programmazione delle windows application con .net, sapr&amp;#224; del famoso &lt;em&gt;freezing&lt;/em&gt; che colpisce l'applicazione in caso di operazioni lunghe/pesanti se tale codice viene elaborato da un evento (click su un button o simile).&lt;/p&gt; &lt;p&gt;Fin dalla versione 1.0 per evitare questo inconveniente era necessario armarsi di delegate e pazienza, e con il classico inconveniente di non poter aggiorare l'interfaccia grafica in caso di utilizzo di questa tecnica se non con l'uso di altri artefizi. Ma veniamo al dunque. Creata una windows forms con un button e una label, voglio fare in modo che alla pressione del button venga visualizzato il messaggio di attesa, e solo alla fine dell'operazione vedere il risultato.&lt;/p&gt; &lt;p&gt;Con il BackgrounWorker la cosa &amp;#232; semplice, anzi, possiamo anche aggiornare l'interfaccia grafica durante l'elaborazione e con poco altro codice permettere il blocco dell'operazione.&lt;/p&gt; &lt;p&gt;&lt;em&gt;backgroundWorker1.DoWork += backgroundWorker1_DoWork; &lt;br /&gt;backgroundWorker1.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted; &lt;br /&gt;backgroundWorker1.ProgressChanged += backgroundWorker1_ProgressChanged; &lt;/em&gt;&lt;/p&gt; &lt;p&gt;Nella prima riga specifico quale evento sar&amp;#224; chiamato quando dovr&amp;#224; essere avviata l'operazione &lt;em&gt;pesante&lt;/em&gt;. La seconda sar&amp;#224; chiamata alla fine della &lt;em&gt;pesante&lt;/em&gt; operazione. La terza, che possiamo invocare noi dal primo evento, per aggiornare eventualmente l'interfaccia grafica. S&amp;#236;, perch&amp;#233; solo questo evento e il secondo potranno aggiornare l'interfaccia grafica. &lt;/p&gt; &lt;p&gt;&lt;em&gt;backgroundWorker1.WorkerReportsProgress = true; &lt;br /&gt;backgroundWorker1.WorkerSupportsCancellation = true; &lt;/em&gt;&lt;/p&gt; &lt;p&gt;Queste righe, invece, attivano la possibilit&amp;#224; di &lt;em&gt;avviare&lt;/em&gt; il terzo evento e di poter &lt;em&gt;bloccare&lt;/em&gt; le operazioni da interfaccia utente. Obbligatori, sono solo l'evento &lt;em&gt;DoWork&lt;/em&gt; e &lt;em&gt;RunWorkerCompleted&lt;/em&gt;. &lt;/p&gt; &lt;p&gt;Ma &amp;#232; ora di cominciare. Ecco l'evento del &lt;em&gt;Button&lt;/em&gt; nella pagina: &lt;/p&gt; &lt;p&gt;&lt;em&gt;private void button1_Click(object sender, EventArgs e) &lt;br /&gt;{ &lt;br /&gt;&lt;/em&gt;&lt;/p&gt; &lt;em&gt;&lt;em&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160; // Disabilito il button di avvio &lt;br /&gt;&lt;/em&gt;&lt;/em&gt;&lt;em&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160; button1.Enabled=false; &lt;br /&gt;&lt;/em&gt;&lt;/em&gt;&lt;em&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160; // Abilito il button di cancel &lt;br /&gt;&lt;/em&gt;&lt;/em&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160; button2.Enabled=true; &lt;br /&gt;&lt;/em&gt;&amp;#160;&amp;#160;&amp;#160; backgroundWorker1.RunWorkerAsync(100); &lt;br /&gt;} &lt;/em&gt; &lt;p&gt;Possiamo passare un parametro facoltativo al nostro codice, di qualsiasi tipo. Per&amp;#242; innanzitutto disabilitiamo il button in modo che non si possa cliccare pi&amp;#249; volte sopra di esso. Con il method &lt;em&gt;RunWorkerAsync&lt;/em&gt;, avviamo il codice presente nell'evento &lt;em&gt;DoWork&lt;/em&gt;. &lt;/p&gt; &lt;p&gt;&lt;em&gt;void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) &lt;br /&gt;{ &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // Leggo il parametro &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int val = int.Parse(e.Argument.ToString()); &lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // Richiedo il Backgroundworker che ha richiamato l'evento &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // per poter richiamare l'evento per l'aggiornamento &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; BackgroundWorker worker = sender as BackgroundWorker; &lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; for (int i = 0; i &amp;lt; val; i += 1) &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; // Richiama l'evento memorizzato in ProgressChanged &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Questo evento accetta come parametro un valore &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // compreso da 0 a 100 (%) &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; worker.ReportProgress(i); &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System.Threading.Thread.Sleep(40); &lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Controllo se &amp;#232; stato premuto il button di Cancel &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (worker.CancellationPending) &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { &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; e.Cancel = true; &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; break; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // Infine passo l'eventuale risultato all'evento finale &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; e.Result = DateTime.Now; &lt;br /&gt;} &lt;/em&gt;&lt;/p&gt; &lt;p&gt;Per aggiornare la window durante l'elaborazione viene utilizzato il method &lt;em&gt;ReportProgress&lt;/em&gt; che accetta come parametro un intero compreso tra &lt;em&gt;zero&lt;/em&gt; e &lt;em&gt;cento&lt;/em&gt; (percentuale di elaborazione). Ecco il codice usato dall'esempio: &lt;/p&gt; &lt;p&gt;&lt;em&gt;void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) &lt;br /&gt;{ &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // Visualizzo aggionamento percentuale nella label &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; label1.Text = string.Format(&amp;quot;{0}%&amp;quot;, e.ProgressPercentage); &lt;br /&gt;} &lt;/em&gt;&lt;/p&gt; &lt;p&gt;Interessante, di questo evento, che possiamo aggiornare qualsiasi oggetto nella &lt;em&gt;window&lt;/em&gt;, anche &lt;em&gt;datagridview&lt;/em&gt; con il simpatico effeto grafico di popolamento dello stesso. Non potendolo passare come parametro &amp;#232; sufficiente definire la fonte dati dello stesso come &lt;em&gt;property&lt;/em&gt; nella classe della pagina, &lt;/p&gt; &lt;p&gt;Ed ecco il codice eseguito automaticamente alla fine di questo codice: &lt;/p&gt; &lt;p&gt;&lt;em&gt;void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) &lt;br /&gt;{ &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // Controllo se l'operazione &amp;#232; stata bloccata dall'utente &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if (e.Cancelled) &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; label1.Text = &amp;quot;Operation Cancelled&amp;quot;; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; else &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; { &lt;br /&gt;&lt;/em&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Visualizzo la data passata dalla elaborazione &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DateTime dt = DateTime.Parse(e.Result.ToString()); &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; label1.Text = dt.ToString(); &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // Riattivo il button di avvio &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; button1.Enabled = true; &lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // E disabilito il button di cancel &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; button2.Enabled = false; &lt;br /&gt;} &lt;/em&gt;&lt;/p&gt; &lt;p&gt;L'operazione di &lt;em&gt;Cancel&lt;/em&gt; &amp;#232; collegato con un normale evento di &lt;em&gt;button2:&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;private void button2_Click(object sender, EventArgs e) &lt;br /&gt;{ &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; backgroundWorker1.CancelAsync(); &lt;br /&gt;}&lt;/em&gt; &lt;/p&gt; &lt;p&gt;Banalmente, segnala al nostro oggetto che &amp;#232; stata richiesta la fine dell'elaborazione del nostro codice. Questo lo possiamo controllare, come si vede sopra, controllando l'evento &lt;em&gt;CancellationPending&lt;/em&gt;. Ovviamente questo operazione &amp;#232; controllabile solo se &amp;#232; in elaborazione il nostro codice. Eventuale richieste pesanti al DB non potranno essere bloccate fino alla restituzione dei dati (senza scomodare ancora i delegate asincroni). &lt;/p&gt; &lt;p&gt;Me lo sono segnato.&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_2.0/" rel="tag"&gt;.NET Framework 2.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Windows_Client/" rel="tag"&gt;Windows Client&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>Memo, .NET Framework, .NET Framework 2.0, Windows Client</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2407/BackgroundWorker-Windows-Forms.aspx</guid><slash:comments>0</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2407/BackgroundWorker-Windows-Forms.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2407.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2407</trackback:ping></item><item><title>Un po' di benchmark tra Linq, Entity Framework e Nhibernate</title><link>http://blogs.aspitalia.com/az/post2404/Podi-Benchmark-Linq-Entity-Framework-Nhibernate.aspx</link><pubDate>Sun, 12 Oct 2008 12:46:17 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2404' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;In un &lt;a href="http://blogs.aspitalia.com/az/post2368/sp-linq-entity-framework-scrittura.aspx"&gt;blog&lt;/a&gt; di qualche tempo fa avevo messo a confronto le prestazioni tra &lt;em&gt;Linq&lt;/em&gt; e l'&lt;em&gt;Entity Framework&lt;/em&gt; in scrittura (e lettura). Anche in questo caso moltissime persone (una) mi hanno chiesto come si comportasse &lt;em&gt;Nhibernate&lt;/em&gt; nel confronto.&lt;/p&gt; &lt;p&gt;Innanzitutto, prima di sentenziare verità assolute che non possiedo, premetto che NON sono affatto un esperto di &lt;em&gt;Nhibernate&lt;/em&gt;: con esso ho solo &lt;em&gt;giocato&lt;/em&gt; in piccole applicazioni di test per testare le prestazioni di questo famoso e ottimo &lt;em&gt;ORM&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;Per evitare discussioni riposto la struttura del database e i file di configurazione utilizzati nel mio test, in modo che gente più esperta di me di questo &lt;em&gt;ORM&lt;/em&gt;, possa segnalarmi eventuali errori:&lt;/p&gt; &lt;p&gt;&lt;img alt="struttura tabelle" src="http://blogs.aspitalia.com/img/andrewz/spvslinqvsentityframeworkinscrittura_141e2/image_1.png" /&gt;&lt;/p&gt; &lt;p&gt;Ed ecco i file di mapping usati per Nhibernate. Per la tabella &lt;em&gt;Padri&lt;/em&gt;:&lt;/p&gt; &lt;p&gt;&lt;em&gt;&amp;lt;?xml version="1.0" encoding="utf-8" ?&amp;gt;&lt;br /&gt;&amp;lt;hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"&lt;br /&gt; assembly="EntitiesX"&lt;br /&gt; namespace="EntitiesX"&lt;br /&gt; default-lazy="false"&lt;br /&gt; &amp;gt;&lt;br /&gt; &amp;lt;class name="Padri" table="Padri"&amp;gt;&lt;br /&gt; &amp;lt;id name="Id" unsaved-value="0" &amp;gt;&lt;br /&gt; &amp;lt;generator /&amp;gt;&lt;br /&gt; &amp;lt;/id&amp;gt; &lt;br /&gt; &amp;lt;property name="NomePadre" /&amp;gt; &lt;br /&gt; &amp;lt;bag name="Figli" cascade="all-delete-orphan"&lt;br /&gt; generic="true" lazy="false" inverse="true"&lt;br /&gt; fetch="join"&amp;gt;&lt;br /&gt; &amp;lt;key column="IdPadre" /&amp;gt;&lt;br /&gt; &amp;lt;one-to-many /&amp;gt;&lt;br /&gt; &amp;lt;/bag&amp;gt;&lt;br /&gt; &amp;lt;/class&amp;gt;&lt;br /&gt;&amp;lt;/hibernate-mapping&amp;gt;&lt;/em&gt; &lt;p&gt;Per la tabella &lt;em&gt;Figli&lt;/em&gt;:&lt;/p&gt; &lt;p&gt;&lt;em&gt;&amp;lt;?xml version="1.0" encoding="utf-8" ?&amp;gt;&lt;br /&gt;&amp;lt;hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"&lt;br /&gt; assembly="EntitiesX"&lt;br /&gt; namespace="EntitiesX"&lt;br /&gt; default-lazy="false"&lt;br /&gt; &amp;gt;&lt;br /&gt; &amp;lt;class name="Figli" table="Figli"&amp;gt;&lt;br /&gt; &amp;lt;id name="Id" unsaved-value="0" &amp;gt;&lt;br /&gt; &amp;lt;generator /&amp;gt;&lt;br /&gt; &amp;lt;/id&amp;gt; &lt;br /&gt; &amp;lt;property name="NomeFiglio" /&amp;gt;&lt;br /&gt; &amp;lt;many-to-one name="Padri" column="IdPadre" /&amp;gt;&lt;br /&gt; &amp;lt;/class&amp;gt;&lt;br /&gt;&amp;lt;/hibernate-mapping&amp;gt;&lt;/em&gt; &lt;p&gt;Per l'inserimento ho usato questo banale codice:&lt;/p&gt; &lt;p&gt;&lt;em&gt;using (ISession session =sessionFactory.OpenSession() )&lt;br /&gt;{&lt;br /&gt; foreach (var padre in coll) session.SaveOrUpdate(padre);&lt;br /&gt; session.Flush();&lt;br /&gt;} &lt;/em&gt; &lt;p&gt;Come nel blog precedente, innanzitutto sono state create cento &lt;em&gt;entity Padri&lt;/em&gt;, con ognuna di essa cento &lt;em&gt;entity Figli&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;Ecco la tabella prestazionale definitiva (rifatta con il carico attuale del computer):&lt;/p&gt; &lt;table cellspacing="0" cellpadding="2" width="500" border="1" unselectable="on"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td  width="125"&gt;&lt;strong&gt;Stored procedure&lt;/strong&gt;&lt;/td&gt; &lt;td  width="125"&gt;&lt;strong&gt;Linq To Sql&lt;/strong&gt;&lt;/td&gt; &lt;td  width="125"&gt;&lt;strong&gt;Entity Framework&lt;/strong&gt;&lt;/td&gt; &lt;td  width="125"&gt;&lt;strong&gt;Nhibernate&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td  width="125"&gt;6.85s&lt;/td&gt; &lt;td  width="125"&gt;24,10&lt;/td&gt; &lt;td  width="125"&gt;14,68&lt;/td&gt; &lt;td  width="125"&gt;13,87&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;Nhibernate, dall'alto dei suoi anni di sviluppo, batte entrambe le tecnologie Microsoft anche se di poco.&lt;/p&gt; &lt;p&gt;Ora vediamo come si portano tutti in lettura. Il codice ripopola tutti gli oggetti con il contenuto delle tabelle. Nel caso di &lt;em&gt;Nhibernate&lt;/em&gt;, il codice è il seguente:&lt;/p&gt; &lt;p&gt;&lt;em&gt;using (ISession session = sessionFactory.OpenSession())&lt;br /&gt;{&lt;br /&gt; IList&amp;lt;EntitiesX.Padri&amp;gt; coll=session.CreateCriteria(typeof(EntitiesX.Padri)).List&amp;lt;EntitiesX.Padri&amp;gt;();&lt;br /&gt; // Check collections&lt;br /&gt;} &lt;/em&gt; &lt;p&gt;Ed ecco i risultati:&lt;/p&gt; &lt;table cellspacing="0" cellpadding="2" width="400" border="1" unselectable="on"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td &gt;&lt;strong&gt;Linq To Sql&lt;/strong&gt;&lt;/td&gt; &lt;td &gt;&lt;strong&gt;Entity Framework&lt;/strong&gt;&lt;/td&gt; &lt;td &gt;&lt;strong&gt;Nhibernate&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td &gt;0,31s&lt;/td&gt; &lt;td &gt;0,91s&lt;/td&gt; &lt;td &gt;0,65s&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;L'&lt;em&gt;Entity Framework&lt;/em&gt; ne ha da strada da fare sul suo diretto e storico rivale...&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/ADO.NET_Entity_Framework/" rel="tag"&gt;ADO.NET Entity Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/LINQ_to_SQL/" rel="tag"&gt;LINQ to SQL&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/NHibernate/" rel="tag"&gt;NHibernate&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/LINQ/" rel="tag"&gt;LINQ&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>.NET2, .NET Framework, .NET Framework 3.5, ADO.NET Entity Framework, LINQ to SQL, NHibernate, LINQ</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2404/Podi-Benchmark-Linq-Entity-Framework-Nhibernate.aspx</guid><slash:comments>1</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2404/Podi-Benchmark-Linq-Entity-Framework-Nhibernate.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2404.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2404</trackback:ping></item><item><title>[OT] Questa mattina...</title><link>http://blogs.aspitalia.com/az/post2394/OT-Mattina.aspx</link><pubDate>Tue, 30 Sep 2008 19:32:20 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2394' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Capita a volte di risvegliarsi senza sapere non solo in quale casa siamo, ma neanche la citt&amp;#224; o paese! Tutto ci&amp;#242; dura per pochi secondi, quindi ritornano alla mente i ricordi di cosa ci ha condotto l&amp;#236; e tutto torna alla normalit&amp;#224;. Al mio risveglio questo plumbeo paesaggio:&lt;/p&gt; &lt;p&gt;&lt;img alt="altrove" src="http://blogs.aspitalia.com/img/andrewz/otquestamattina_120cf/immag038_3.jpg" width="520" border="0" /&gt; &lt;/p&gt; &lt;p&gt;Mi ha fatto tornare alla mente, anche se non ne capisco il collegamento, una novella di Poe:&lt;/p&gt; &lt;p&gt;&lt;em&gt;... Lo spettrale Pericolo cui ero &lt;br /&gt;soggetto mi perseguitava notte e giorno. Nella prima le torture della &lt;br /&gt;meditazione erano eccessive, nel secondo intollerabili. Quando le tetre &lt;br /&gt;Tenebre avviluppavano la Terra, io allora rabbrividivo al solo terrore di &lt;br /&gt;dover ancora pensare... rabbrividivo come rabbrividiscono sul carro &lt;br /&gt;funebre gli ondeggianti pennacchi. Allorche' la Natura non riusciva piu' &lt;br /&gt;a sopportare lo stato di veglia, era solo dopo uno sforzo violento che io &lt;br /&gt;cedevo al sonno, poiche' mi agghiacciava il timore di trovarmi al &lt;br /&gt;risveglio abitatore di una tomba. E allorche' infine cadevo in una specie &lt;br /&gt;di sonnolenza, cio' era solo per sentirmi trasportato immediatamente in &lt;br /&gt;un mondo di fantasmi, al disopra del quale si librava sovrana, unica, &lt;br /&gt;sepolcrale, l'Idea...&lt;/em&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>Andrea Zani</dc:creator><category>Parole..., Off Topic</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2394/OT-Mattina.aspx</guid><slash:comments>0</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2394/OT-Mattina.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2394.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2394</trackback:ping></item><item><title>Triplet class non &amp;#232; un oggetto curioso, &amp;#232; utilissimo!!!</title><link>http://blogs.aspitalia.com/az/post2386/Triplet-Class-Oggetto-Curioso-Utilissimo.aspx</link><pubDate>Fri, 12 Sep 2008 15:11:08 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2386' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Esiste dalla versione 1.0 del Framework. Lo ritendo &lt;strike&gt;l'oggetto pi&amp;#249; curioso all'interno dello stesso &lt;/strike&gt;un oggetto utilissimo per l'uso del viewstate e la creazione dei custom control cos&amp;#236; come spiegano nei commenti Cristian e Daniele.&lt;/p&gt; &lt;p&gt;Accetta tre parametri object. Esempio da &lt;a title="link esterno" href="http://msdn.microsoft.com/it-it/library/system.web.ui.triplet.aspx"&gt;MSDN&lt;/a&gt;:&lt;/p&gt; &lt;p&gt;&lt;em&gt;Triplet circle = new Triplet(5, 7, 3); &lt;br /&gt;lblCircle.Text = &amp;quot;X position: &amp;quot; + circle.First + &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;&amp;lt;br /&amp;gt;Y position: &amp;quot; + circle.Second + &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;&amp;lt;br /&amp;gt;Radius: &amp;quot; + circle.Third; &lt;br /&gt; &lt;br /&gt;Triplet labels = new Triplet(Label1, Label2, Label3); &lt;br /&gt;Label1.Text = &amp;quot;Type: &amp;quot; + labels.First.GetType().ToString(); &lt;br /&gt;Label2.Text = &amp;quot;ToString: &amp;quot; + labels.Second.ToString(); &lt;br /&gt;Label3.Text = &amp;quot;HashCode: &amp;quot; + labels.Third.GetHashCode(); &lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;strike&gt;Sono basito.&lt;/strike&gt;&lt;/p&gt; &lt;p&gt;&lt;strike&gt;Essendo venerd&amp;#236; un po' di leggerezza, no?&lt;/strike&gt;&lt;/p&gt; &lt;p&gt;Blog modificato per evitare il linciaggio! :)&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/post2386/Triplet-Class-Oggetto-Curioso-Utilissimo.aspx</guid><slash:comments>13</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2386/Triplet-Class-Oggetto-Curioso-Utilissimo.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2386.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2386</trackback:ping></item><item><title>Entity Framework e stranezze(*)</title><link>http://blogs.aspitalia.com/az/post2385/Entity-Framework-Stranezze.aspx</link><pubDate>Fri, 12 Sep 2008 07:11:33 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2385' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;&lt;em&gt;Entity&lt;/em&gt;:&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;img height="200" alt="entity" src="http://blogs.aspitalia.com/img/andrewz/entityframeworkestranezze_8108/entity_3.gif" width="394" border="0" /&gt; &lt;/p&gt; &lt;p&gt;Codice:&lt;/p&gt; &lt;p&gt;&lt;em&gt;// Step 1 &lt;br /&gt;var coll2 = (from c in context.Men.Include(&amp;quot;Women&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; select c).First(); &lt;br /&gt;&lt;/em&gt;// &lt;br /&gt;// Visualizza item; &lt;br /&gt;//---------------------------------------------------------------- &lt;br /&gt;// &lt;br /&gt;// Step 2 &lt;br /&gt;// &lt;br /&gt;&lt;em&gt;coll2.Age++; &lt;br /&gt;coll2.Women.Age++; &lt;br /&gt;// &lt;br /&gt;// Visualizza item; &lt;br /&gt;//----------------------------------------------------------------- &lt;br /&gt;// &lt;br /&gt;// Step 3 &lt;br /&gt;// &lt;br /&gt;var coll3 = from c in context.Men.Include(&amp;quot;Women&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; select c; &lt;br /&gt;foreach (var item in coll3) &lt;br /&gt;{ &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // Visualizza item; &lt;br /&gt;}&lt;/em&gt; &lt;/p&gt; &lt;p&gt;Nel primo caso come age della prima &lt;em&gt;entity&lt;/em&gt; e della seconda, viene visualizzato il contenuto iniziale della tabella (viene eseguita la query visibile grazie al profiler):&lt;/p&gt; &lt;p&gt;&lt;em&gt;1 e 1&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Al secondo step viene visualizzato:&lt;/p&gt; &lt;p&gt;&lt;em&gt;2 e 2&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Domanda finale... Che cosa viene visualizzato allo step 3? Do un aiuto, con il profiler &amp;#232; visibile la query di select delle due &lt;em&gt;entity&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;Dunque?&lt;/p&gt; &lt;p&gt;Qual &amp;#232; la risposta?&lt;/p&gt; &lt;p&gt;Sto aspettando...&lt;/p&gt; &lt;p&gt;Be', si potrebbe pensare che visualizzi ancora 1 e 1 visto che esegue richiede le due tabella al database che ritornano i valori iniziali (proprio ci&amp;#242; che avviene), ma invece viene visualizzato:&lt;/p&gt; &lt;p&gt;&lt;em&gt;2 e 2!!!&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Ma perch&amp;#233; esegue la query se alla finfine prende ancora i dati aggiornati in precedenza?&lt;/p&gt; &lt;p&gt;Un attimo di pensieri alterni...&lt;/p&gt; &lt;p&gt;Giungo alla conclusione che esegue queste query con controllare la consistenza dei dati, per vedere se eventualmente il record sul db &amp;#232; stato modificato da qualcosa d'altro. Anzi, oso di pi&amp;#249;, mi convinco che sia questo il motivo.&lt;/p&gt; &lt;p&gt;Avvio il profiler e l'enterprise manager.&lt;/p&gt; &lt;p&gt;Eseguo i due step, blocco, modifico il record esternamente, e eseguo l'ultimo passo. La query viene eseguita e presi i dati... ma non accade nulla!!! Nulla di nulla!&lt;/p&gt; &lt;p&gt;Non mi arrendo. Modifico le propriet&amp;#224; delle due &lt;em&gt;entity&lt;/em&gt;. Imposto &lt;em&gt;Age&lt;/em&gt; come &lt;em&gt;Concurrency Mode&lt;/em&gt; a &lt;em&gt;Fixed&lt;/em&gt;. Riprovo. Non cambia nulla... uff... Per avere aggiornati i dati dobbiamo &lt;em&gt;forzare&lt;/em&gt; la cosa:&lt;/p&gt; &lt;p&gt;&lt;em&gt;// &lt;br /&gt;// Step 3 &lt;br /&gt;// &lt;br /&gt;var coll3 = from c in context.Men.Include(&amp;quot;Women&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; select c; &lt;br /&gt;foreach (var item in coll3) &lt;br /&gt;{ &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; context.Refresh(System.Data.Objects.RefreshMode.StoreWins, item); &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; context.Refresh(System.Data.Objects.RefreshMode.StoreWins, item.Women); &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // Visualizzo dati &lt;br /&gt;}&lt;/em&gt; &lt;/p&gt; &lt;p&gt;Buono a sapersi, ma perch&amp;#233; la query non la fa in questo caso e solo questo?&lt;/p&gt; &lt;p&gt;(*) La parola &lt;em&gt;strano&lt;/em&gt;, che vuol d&amp;#236;? Qualcosa che non &amp;#232; normale, qualcosa al di fuori di ogni schema? Ma in s&amp;#233;, che significa? E' una prola senza significato. Cos'&amp;#232; &lt;em&gt;strano&lt;/em&gt;? Ci&amp;#242; che fuori dal normale senso civico e comportamentale? Chi ha creato l'&lt;em&gt;Entity Framework &lt;/em&gt;sapr&amp;#224; dirmi il perch&amp;#233; di questo comportamento che riterr&amp;#224; normale... dunque &amp;#232; strano ci&amp;#242; che penso io! &lt;em&gt;Strano&lt;/em&gt; &amp;#232; una parola inutile, da cancellare. Che parola odiosa.&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/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;/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, .NET Framework, .NET Framework 3.5, ADO.NET Entity Framework, LINQ</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2385/Entity-Framework-Stranezze.aspx</guid><slash:comments>6</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2385/Entity-Framework-Stranezze.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2385.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2385</trackback:ping></item><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;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;/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, .NET Framework, .NET Framework 3.5, ADO.NET Entity Framework, LINQ</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>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;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;/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, .NET Framework, .NET Framework 3.5, ADO.NET Entity Framework, LINQ</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></channel></rss>