<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Il blog di Pietro Libro</title>
        <link>http://blogs.ugidotnet.org/PietroLibroBlog/Default.aspx</link>
        <description />
        <language>it-IT</language>
        <copyright>Pietro Libro</copyright>
        <managingEditor>pietro.libro@libero.it</managingEditor>
        <generator>Subtext Version 2.1.0.3</generator>
        <image>
            <title>Il blog di Pietro Libro</title>
            <url>http://blogs.ugidotnet.org/images/RSS2Image.gif</url>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/Default.aspx</link>
            <width>77</width>
            <height>60</height>
        </image>
        <item>
            <title>EF 4.3 Released</title>
            <category>.Net Framework 4.0</category>
            <category>Entity Framework 4</category>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/02/10/ef-4.3-released.aspx</link>
            <description>&lt;p&gt;Rilasciata la versione 4.3 di Entity Framework, tra le novità introdotte in questa release, il più interessante IMHO il supporto all’evoluzione di un database generato utilizzando l’approccio Code First. Installazione semplice ed indolore tramite NuGet &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Sorriso" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/EF-4.3-Released_6661/wlEmoticon-smile_2.png" /&gt; : Install-Package EntityFramework. Per il supporto agli Enum bisognerà aspettare la versione 5.0 (.Net 4.5). Tutti i dettagli sul post dell’ ADO.NET Team: &lt;a title="http://blogs.msdn.com/b/adonet/archive/2012/02/09/ef-4-3-released.aspx" href="http://blogs.msdn.com/b/adonet/archive/2012/02/09/ef-4-3-released.aspx"&gt;http://blogs.msdn.com/b/adonet/archive/2012/02/09/ef-4-3-released.aspx&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/100765.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/02/10/ef-4.3-released.aspx</guid>
            <pubDate>Fri, 10 Feb 2012 06:21:00 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/PietroLibroBlog/comments/100765.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/02/10/ef-4.3-released.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/100765.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/100765.aspx</trackback:ping>
        </item>
        <item>
            <title>DomusDotNet: WCF Data Services (Terza Parte)</title>
            <category>C#</category>
            <category>WCF</category>
            <category>.Net Framework 4.0</category>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/01/25/domusdotnet-wcf-data-services-terza-parte.aspx</link>
            <description>&lt;p&gt;Terzo ed ultimo articolo (qualcuno dirà finalmente &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Sorriso" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/DomusDotNet-WCF-Data-Services-Terza-Part_C471/wlEmoticon-smile_2.png" /&gt;) della serie dedicata ai WCF Data Services. Articolo completo su &lt;a href="http://www.domusdotnet.org/articoli/wcf-data-services-%28parte-3%29.aspx" target="_blank"&gt;DomusDotNet&lt;/a&gt;. Critiche, consigli e suggerimenti sono sempre ben accetti.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/100729.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/01/25/domusdotnet-wcf-data-services-terza-parte.aspx</guid>
            <pubDate>Wed, 25 Jan 2012 12:59:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/01/25/domusdotnet-wcf-data-services-terza-parte.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/100729.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/100729.aspx</trackback:ping>
        </item>
        <item>
            <title>OData T4 for C#</title>
            <category>C#</category>
            <category>WCF</category>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/01/20/odata-t4-for-c.aspx</link>
            <description>&lt;p&gt;Annuncio fresco fresco (quasi &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Sorriso" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/OData-T4_994A/wlEmoticon-smile_2.png" /&gt; ) da parte del WCF Data Services Team Blog : &lt;a title="http://blogs.msdn.com/b/astoriateam/archive/2012/01/19/announcing-odata-t4-for-c-preview-1.aspx" href="http://blogs.msdn.com/b/astoriateam/archive/2012/01/19/announcing-odata-t4-for-c-preview-1.aspx"&gt;http://blogs.msdn.com/b/astoriateam/archive/2012/01/19/announcing-odata-t4-for-c-preview-1.aspx&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/100715.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/01/20/odata-t4-for-c.aspx</guid>
            <pubDate>Fri, 20 Jan 2012 09:54:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/01/20/odata-t4-for-c.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/100715.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/100715.aspx</trackback:ping>
        </item>
        <item>
            <title>MCTS 70-513</title>
            <category>.Net Framework 4.0</category>
            <category>WCF</category>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/01/17/mcts-70-513.aspx</link>
            <description>&lt;p&gt;Ieri, anche questo è andato. E’ stata una bella soddisfazione. Ora avanti per l’MCPD &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Sorriso" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/302cff485d01_E43F/wlEmoticon-smile_2.png" /&gt;. &lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/100707.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/01/17/mcts-70-513.aspx</guid>
            <pubDate>Tue, 17 Jan 2012 15:15:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/01/17/mcts-70-513.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/100707.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/100707.aspx</trackback:ping>
        </item>
        <item>
            <title>DomusDotNet: WCF Data Services (Seconda Parte)</title>
            <category>.Net Framework 4.0</category>
            <category>C#</category>
            <category>WCF</category>
            <category>Entity Framework 4.2</category>
            <category>Entity Framework 4.1</category>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/01/11/domusdotnet-wcf-data-services-seconda-parte.aspx</link>
            <description>&lt;p&gt;Secondo articolo della serie dedicata ai WCF Data Services: utilizzo con Entity Framework, ed approfondimento su Service Operations. Nel codice allegato un client ASP.NET MVC di test. Articolo completo sul sito di &lt;a href="http://www.domusdotnet.org/articoli/wcf-data-services-%28parte-2%29.aspx" target="_blank"&gt;DomusDotNet&lt;/a&gt;. Al solito, consigli e suggerimenti sono sempre ben accetti &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Sorriso" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/DomusDotNet-WCF-Data-Services-Seconda-Pa_60A5/wlEmoticon-smile_2.png" /&gt;.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/100692.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/01/11/domusdotnet-wcf-data-services-seconda-parte.aspx</guid>
            <pubDate>Wed, 11 Jan 2012 05:56:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/01/11/domusdotnet-wcf-data-services-seconda-parte.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/100692.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/100692.aspx</trackback:ping>
        </item>
        <item>
            <title>SharePoint 2010 e ASP.NET</title>
            <category>ASP.NET</category>
            <category>Varie ed eventuali</category>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2011/12/23/sharepoint-2010-e-asp.net.aspx</link>
            <description>&lt;p&gt;Sul blog di MSDN Italia è stato aggiunto un post che riporta link ad una serie di video su SharePoint 2010 per sviluppatori ASP.NET, per chi fosse interessato, tutti i dettagli &lt;a href="http://blogs.msdn.com/b/italy/archive/2011/12/22/video-su-sharepoint-2010-per-sviluppatori-asp-net.aspx" target="_blank"&gt;qui&lt;/a&gt;.Un bel regalo di Natale &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Sorriso" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Sharepoint-2010-e-ASP.NET_9E22/wlEmoticon-smile_2.png" /&gt;.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/100650.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2011/12/23/sharepoint-2010-e-asp.net.aspx</guid>
            <pubDate>Fri, 23 Dec 2011 10:18:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2011/12/23/sharepoint-2010-e-asp.net.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/100650.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/100650.aspx</trackback:ping>
        </item>
        <item>
            <title>DomusDotNet: WCF Data Services (Prima parte)</title>
            <category>.Net Framework 4.0</category>
            <category>Entity Framework 4</category>
            <category>WCF</category>
            <category>ASP.NET</category>
            <category>C#</category>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2011/12/21/domusdotnet-wcf-data-services-prima-parte.aspx</link>
            <description>&lt;p&gt;Prima parte di una serie di articoli dedicati ai WCF Data Services, al protocollo OData e REST. Per gli interessati , articolo completo &lt;a href="http://www.domusdotnet.org/articoli/wcf-data-services---prima-parte.aspx" target="_blank"&gt;qui&lt;/a&gt;. &lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/100645.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2011/12/21/domusdotnet-wcf-data-services-prima-parte.aspx</guid>
            <pubDate>Tue, 20 Dec 2011 23:00:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2011/12/21/domusdotnet-wcf-data-services-prima-parte.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/100645.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/100645.aspx</trackback:ping>
        </item>
        <item>
            <title>EF Code First Migrations Beta 1 (Parte 2)</title>
            <category>.Net Framework 4.0</category>
            <category>Code First Migrations</category>
            <category>Entity Framework 4</category>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2011/12/04/ef-code-first-migrations-beta-1-parte-2.aspx</link>
            <description>&lt;p&gt;In questa seconda parte proveremo ad eseguire gli stessi passi eseguiti &lt;a href="http://blogs.ugidotnet.org/PietroLibroBlog/archive/2011/12/01/ef-code-first-migrations-beta-1-parte-1.aspx" target="_blank"&gt;in precedenza&lt;/a&gt; utilizzando “la migrazione automatica dello schema”. Per comodità riporto la classe &lt;em&gt;DbContext&lt;/em&gt; ed il semplice Object Model utilizzato per la definizione dello schema del database:&lt;/p&gt;  &lt;pre class="csharpcode"&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; OfficeContext : DbContext
    {
        &lt;span class="kwrd"&gt;public&lt;/span&gt; OfficeContext()
            : &lt;span class="kwrd"&gt;base&lt;/span&gt;(&lt;span class="str"&gt;"OfficeDB"&lt;/span&gt;)
        {
        }
        &lt;span class="kwrd"&gt;public&lt;/span&gt; DbSet&amp;lt;Employee&amp;gt; Employees { get; set; }
        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnModelCreating(DbModelBuilder modelBuilder)
        {
            &lt;span class="kwrd"&gt;base&lt;/span&gt;.OnModelCreating(modelBuilder);
        }
        &lt;span class="kwrd"&gt;static&lt;/span&gt; OfficeContext()
        {
            Database.SetInitializer&amp;lt;OfficeContext&amp;gt;(&lt;span class="kwrd"&gt;null&lt;/span&gt;);
        }
    }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Employee
    {
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Id { get; set; }
        &lt;span class="kwrd"&gt;public&lt;/span&gt; String Name { get; set; }
        &lt;span class="kwrd"&gt;public&lt;/span&gt; String Surname { get; set; }
        &lt;span class="kwrd"&gt;public&lt;/span&gt; String Role { get; set; }
    }&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode {
	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small
}
.csharpcode pre {
	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small
}
.csharpcode pre {
	margin: 0em
}
.csharpcode .rem {
	color: #008000
}
.csharpcode .kwrd {
	color: #0000ff
}
.csharpcode .str {
	color: #006080
}
.csharpcode .op {
	color: #0000c0
}
.csharpcode .preproc {
	color: #cc6633
}
.csharpcode .asp {
	background-color: #ffff00
}
.csharpcode .html {
	color: #800000
}
.csharpcode .attr {
	color: #ff0000
}
.csharpcode .alt {
	background-color: #f4f4f4; margin: 0em; width: 100%
}
.csharpcode .lnum {
	color: #606060
}]]&gt;&lt;/style&gt;

&lt;p&gt;Avendo aggiunto &lt;em&gt;EntityFramework.Migrations&lt;/em&gt; in precedenza, per continuare, dobbiamo aprire la classe &lt;em&gt;Configuration.cs&lt;/em&gt; all’interno della cartella &lt;em&gt;Migrations&lt;/em&gt; ed impostare la proprietà &lt;em&gt;AutomaticMigrationsEnabled&lt;/em&gt; a &lt;em&gt;true&lt;/em&gt;:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; Configuration()
{            
    AutomaticMigrationsEnabled = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
    AutomaticMigrationDataLossAllowed = &lt;span class="kwrd"&gt;false&lt;/span&gt;;
}&lt;/pre&gt;

&lt;p /&gt;&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode {
	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small
}
.csharpcode pre {
	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small
}
.csharpcode pre {
	margin: 0em
}
.csharpcode .rem {
	color: #008000
}
.csharpcode .kwrd {
	color: #0000ff
}
.csharpcode .str {
	color: #006080
}
.csharpcode .op {
	color: #0000c0
}
.csharpcode .preproc {
	color: #cc6633
}
.csharpcode .asp {
	background-color: #ffff00
}
.csharpcode .html {
	color: #800000
}
.csharpcode .attr {
	color: #ff0000
}
.csharpcode .alt {
	background-color: #f4f4f4; margin: 0em; width: 100%
}
.csharpcode .lnum {
	color: #606060
}]]&gt;&lt;/style&gt;Inoltre impostiamo la proprietà &lt;em&gt;AutomaticMigrationDataLossAllowed=false&lt;/em&gt;: in questo modo un’eccezione verrà sollevata nel caso in cui la migrazione dello schema comporti una perdita di dati. Nell’&lt;em&gt;override&lt;/em&gt; del metodo &lt;em&gt;Seed&lt;/em&gt; aggiungiamo del codice per inserire delle righe dopo la generazione\migrazione dello schema:

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Seed(OfficeContext context)
{            
    context.AddOrUpdate(
        &lt;span class="kwrd"&gt;new&lt;/span&gt; Employee() { Name = &lt;span class="str"&gt;"Mario"&lt;/span&gt;, Surname = &lt;span class="str"&gt;"Rossi"&lt;/span&gt;, Role = &lt;span class="str"&gt;"Administrator"&lt;/span&gt; },
        &lt;span class="kwrd"&gt;new&lt;/span&gt; Employee() { Name = &lt;span class="str"&gt;"Giulio"&lt;/span&gt;, Surname = &lt;span class="str"&gt;"Verdi"&lt;/span&gt;, Role = &lt;span class="str"&gt;"Store Manager"&lt;/span&gt; },
        &lt;span class="kwrd"&gt;new&lt;/span&gt; Employee() { Name = &lt;span class="str"&gt;"Pietro"&lt;/span&gt;, Surname = &lt;span class="str"&gt;"Libro"&lt;/span&gt;, Role = &lt;span class="str"&gt;"Art Director"&lt;/span&gt; }
        );
}&lt;/pre&gt;

&lt;p /&gt;&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode {
	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small
}
.csharpcode pre {
	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small
}
.csharpcode pre {
	margin: 0em
}
.csharpcode .rem {
	color: #008000
}
.csharpcode .kwrd {
	color: #0000ff
}
.csharpcode .str {
	color: #006080
}
.csharpcode .op {
	color: #0000c0
}
.csharpcode .preproc {
	color: #cc6633
}
.csharpcode .asp {
	background-color: #ffff00
}
.csharpcode .html {
	color: #800000
}
.csharpcode .attr {
	color: #ff0000
}
.csharpcode .alt {
	background-color: #f4f4f4; margin: 0em; width: 100%
}
.csharpcode .lnum {
	color: #606060
}]]&gt;&lt;/style&gt;A differenza della procedura manuale, digitiamo direttamente il comando &lt;em&gt;update-database &lt;/em&gt;nella console di NuGet, eventualmente utilizzato i parametri –&lt;em&gt;verbose&lt;/em&gt;  o &lt;em&gt;-script&lt;/em&gt; rispettivamente per visualizzare o creare un file di &lt;em&gt;.sql&lt;/em&gt; con i comandi generati da VS:

&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/63a1691fa2c0_8580/image_4.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/63a1691fa2c0_8580/image_thumb_1.png" width="244" height="210" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Come per la prima parte, utilizzando ad esempio SQL Management Studio, vediamo che il lavoro “sporco” sia stato eseguito correttamente come ci aspettavamo:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/63a1691fa2c0_8580/image_6.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/63a1691fa2c0_8580/image_thumb_2.png" width="244" height="104" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ora, se volessimo apportare le stesse modifiche allo schema del modello dati, come nel caso del &lt;a href="http://blogs.ugidotnet.org/PietroLibroBlog/archive/2011/12/01/ef-code-first-migrations-beta-1-parte-1.aspx" target="_blank"&gt;post precedente&lt;/a&gt;, dovremmo ritornare “in modalità manuale” (in quanto, in questa modalità non possiamo specificare i valori di default per i nuovi campi o utilizzare codice SQL custom) quindi  utilizzando il comando &lt;em&gt;Add-Migration&lt;/em&gt; e relativi parametri. Ovviamente abbiamo già discusso su come eseguire questi passaggi e non staremo qui a ripeterli:  IMHO la migrazione automatica non mi ha entusiasmato molto a differenza di quella manuale dove è possibile intervenire in diversi punti.&lt;/p&gt;

&lt;p&gt;Proviamo ora ad eliminare (o commentare) la proprietà &lt;em&gt;Surname&lt;/em&gt;  dall’entità &lt;em&gt;Employee&lt;/em&gt;:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Employee
    {
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Id { get; set; }
        &lt;span class="kwrd"&gt;public&lt;/span&gt; String Name { get; set; }
        &lt;span class="kwrd"&gt;public&lt;/span&gt; String Role { get; set; }
    }&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode {
	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small
}
.csharpcode pre {
	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small
}
.csharpcode pre {
	margin: 0em
}
.csharpcode .rem {
	color: #008000
}
.csharpcode .kwrd {
	color: #0000ff
}
.csharpcode .str {
	color: #006080
}
.csharpcode .op {
	color: #0000c0
}
.csharpcode .preproc {
	color: #cc6633
}
.csharpcode .asp {
	background-color: #ffff00
}
.csharpcode .html {
	color: #800000
}
.csharpcode .attr {
	color: #ff0000
}
.csharpcode .alt {
	background-color: #f4f4f4; margin: 0em; width: 100%
}
.csharpcode .lnum {
	color: #606060
}]]&gt;&lt;/style&gt;

&lt;p&gt;Commentiamo il codice presente nel &lt;em&gt;Seed &lt;/em&gt;ed eseguiamo il comando &lt;em&gt;update-database&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/63a1691fa2c0_8580/image_8.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/63a1691fa2c0_8580/image_thumb_3.png" width="244" height="107" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Entity Framework ci avverte che l’aggiornamento non è stato completato perché potrebbe verificarsi una perdita di dati, ma allo stesso tempo ci suggerisce di utilizzare il parametro &lt;em&gt;–force &lt;/em&gt;per forzare l’aggiornamento della base di dati (con conseguente &lt;em&gt;data loss&lt;/em&gt;). Ok.&lt;/p&gt;

&lt;p&gt;Oltre a commentare il codice (non proprio una &lt;em&gt;best practice&lt;/em&gt;) per evitare di aggiungere dati duplicati tramite &lt;em&gt;l’AddOrUpdate&lt;/em&gt; del &lt;em&gt;Seed  &lt;/em&gt;è sufficiente istruire VS con una &lt;em&gt;Func&amp;lt;TEntity,Object&amp;gt;&lt;/em&gt; al fine di specificare quali proprietà devono essere considerate per identificare un record come duplicato:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;System.Linq.Expressions.Expression&amp;lt;Func&amp;lt;Employee, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; identify =
    n =&amp;gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; { n.Name, n.Role  };

context.AddOrUpdate(identify,
    &lt;span class="kwrd"&gt;new&lt;/span&gt; Employee() { Name = &lt;span class="str"&gt;"Mario"&lt;/span&gt;, Role = &lt;span class="str"&gt;"Administrator"&lt;/span&gt; },
    &lt;span class="kwrd"&gt;new&lt;/span&gt; Employee() { Name = &lt;span class="str"&gt;"Giulio"&lt;/span&gt;, Role = &lt;span class="str"&gt;"Store Manager"&lt;/span&gt; },
    &lt;span class="kwrd"&gt;new&lt;/span&gt; Employee() { Name = &lt;span class="str"&gt;"Pietro"&lt;/span&gt;, Role = &lt;span class="str"&gt;"Art Director"&lt;/span&gt; }
    );&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/100600.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2011/12/04/ef-code-first-migrations-beta-1-parte-2.aspx</guid>
            <pubDate>Sun, 04 Dec 2011 06:42:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2011/12/04/ef-code-first-migrations-beta-1-parte-2.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/100600.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/100600.aspx</trackback:ping>
        </item>
        <item>
            <title>EF Code First Migrations Beta 1 (Parte 1)</title>
            <category>Code First Migrations</category>
            <category>C#</category>
            <category>.Net Framework 4.0</category>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2011/12/01/ef-code-first-migrations-beta-1-parte-1.aspx</link>
            <description>&lt;p&gt; &lt;/p&gt;  &lt;p&gt;Finalmente sono riuscito a trovare qualche minuto per buttare giù qualche riga a riguardo di EF Code First Migrations (da qualche giorno disponibile in  beta 1). Per chi usa l’approccio Code First l’aggiornamento del modello e della base di dati sottostante (soprattutto quando contiene dati)  è un grosso problema. Proviamo a testare il funzionamento del “pacchetto” su un modello molto semplice come il seguente, in un progetto console C#:&lt;/p&gt;  &lt;pre class="csharpcode"&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; OfficeContext : DbContext
    {
        &lt;span class="kwrd"&gt;public&lt;/span&gt; OfficeContext()
            : &lt;span class="kwrd"&gt;base&lt;/span&gt;(&lt;span class="str"&gt;"OfficeDB"&lt;/span&gt;)
        {
        }
        &lt;span class="kwrd"&gt;public&lt;/span&gt; DbSet&amp;lt;Employee&amp;gt; Employees { get; set; }
        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnModelCreating(DbModelBuilder modelBuilder)
        {
            &lt;span class="kwrd"&gt;base&lt;/span&gt;.OnModelCreating(modelBuilder);
        }
        &lt;span class="kwrd"&gt;static&lt;/span&gt; OfficeContext()
        {
            Database.SetInitializer&amp;lt;OfficeContext&amp;gt;(&lt;span class="kwrd"&gt;null&lt;/span&gt;);
        }
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Employee
    {
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Id { get; set; }
        &lt;span class="kwrd"&gt;public&lt;/span&gt; String Name { get; set; }
        &lt;span class="kwrd"&gt;public&lt;/span&gt; String Surnamte { get; set; }
        &lt;span class="kwrd"&gt;public&lt;/span&gt; String Role { get; set; }
    }&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;Aggiungiamo al progetto un file &lt;em&gt;App.Config&lt;/em&gt; con una stringa di connessione simile alla seguente:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="OfficeDB"&lt;/span&gt; &lt;span class="attr"&gt;connectionString&lt;/span&gt;&lt;span class="kwrd"&gt;="Data Source=(local)\SQLEXPRESS;Initial Catalog=OfficeDB;Integrated Security=True;"&lt;/span&gt; &lt;span class="attr"&gt;providerName&lt;/span&gt;&lt;span class="kwrd"&gt;="System.Data.SqlClient"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;Per come abbiamo configurato il &lt;em&gt;DBContext&lt;/em&gt; nessun database verrà generato, anzi, a &lt;em&gt;runtime&lt;/em&gt; avremo un’eccezione di questo tipo:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/8f18e8ce678b_12CCB/image_6.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/8f18e8ce678b_12CCB/image_thumb_2.png" width="244" height="114" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Procediamo con l’installazione via NuGet del Package &lt;em&gt;EntityFramework.Migrations&lt;/em&gt; (&lt;em&gt;Code First Migrations Beta 1, ver. 0.8.0.0&lt;/em&gt;):&lt;/p&gt;



&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/8f18e8ce678b_12CCB/image_2.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/8f18e8ce678b_12CCB/image_thumb.png" width="244" height="164" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Durante il processo di installazione viene automaticamente aggiunta al progetto una nuova cartella, “Migrations” contenente il file &lt;em&gt;Configuration.cs &lt;/em&gt;(derivata da &lt;em&gt;DbMigrationsConfiguration&amp;lt;T&amp;gt;&lt;/em&gt; dove T è la classe &lt;em&gt;OfficeContext&lt;/em&gt;) nel quale possiamo specificare, ad esempio, se utilizzare la “migrazione automatica del modello” (vedremo in seguito) tramite la proprietà &lt;em&gt;AutomaticMigrationsEnabled &lt;/em&gt;(&lt;em&gt;false&lt;/em&gt; di default), se continuare o meno una migrazione dello schema anche in presenza di perdita dei dati, &lt;em&gt;AutomaticMigrationDataLossAllowed, &lt;/em&gt;o se sollevare un’eccezione. Inoltre tramite &lt;em&gt;l’override&lt;/em&gt; di &lt;em&gt;Seed &lt;/em&gt;è possibile specificare se aggiungere dopo la generazione\migrazione dello schema, dei dati al database (avendo avuto qualche problema nei test con l’estensione &lt;em&gt;AddOrUpdate&lt;/em&gt; preferisco utilizzare codice SQL per il momento &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Sorriso" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/8f18e8ce678b_12CCB/wlEmoticon-smile_2.png" /&gt;) . La classe &lt;em&gt;Configuration&lt;/em&gt; sarà così definita:&lt;/p&gt;

&lt;pre class="csharpcode"&gt; &lt;span class="kwrd"&gt;internal&lt;/span&gt; &lt;span class="kwrd"&gt;sealed&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Configuration : DbMigrationsConfiguration&amp;lt;OfficeContext&amp;gt;
    {
        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Seed(OfficeContext context)
        {
            &lt;span class="kwrd"&gt;base&lt;/span&gt;.Seed(context);
        }
        &lt;span class="kwrd"&gt;public&lt;/span&gt; Configuration()
        {
            AutomaticMigrationsEnabled = &lt;span class="kwrd"&gt;false&lt;/span&gt;;
            AutomaticMigrationDataLossAllowed = &lt;span class="kwrd"&gt;false&lt;/span&gt;;
        }
    }&lt;/pre&gt;

&lt;p&gt;Ora, per eseguire la creazione del database, dobbiamo aggiungere “a scaffale” la nostra prima “migrazione”(ovvero la generazione del database): così facendo, oltre a richiamare i metodi per la generazione del database, potremmo eseguire nel tempo degli &lt;em&gt;Upgrade&lt;/em&gt; e &lt;em&gt;Downgrade&lt;/em&gt; utilizzando i vari piani di migrazione che andremo a creare: se uniamo a quanto detto TFS, penso non ci sia altro da aggiungere. Nella console di NuGet (Package Manager Console) digitiamo : &lt;em&gt;Add-Migration [parametro] &lt;/em&gt;dove parametro è un etichetta che identifica in modo univoco la migrazione che stiamo aggiungendo. Nel nostro caso &lt;em&gt;parametro&lt;/em&gt;=&lt;em&gt;OfficeDBFirstMigration.  &lt;/em&gt;Se tutto procede senza errori, la schermata della console di NuGet dovrebbe essere simile alla seguente:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/8f18e8ce678b_12CCB/image_8.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/8f18e8ce678b_12CCB/image_thumb_3.png" width="244" height="120" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Al progetto viene aggiunto un un file &lt;em&gt;xxxx_OfficeDBFirstMigration.cs&lt;/em&gt; contenente uno “Snapshot” del modello Code First del database da creare definito dalla classe &lt;em&gt;DbContext&lt;/em&gt; (&lt;em&gt;OfficeContext&lt;/em&gt; per il caso specifico). Per generare il database, digitiamo il comando &lt;em&gt;Update-Database &lt;/em&gt;(che prende in considerazione l’ultimo file di migrazione “Pending”,  “a scaffale”)&lt;em&gt;, &lt;/em&gt;eventualmente aggiungendo il parametro &lt;em&gt;–Verbose &lt;/em&gt;per visualizzare i comandi SQL generati, oppure il parametro &lt;em&gt;–Script&lt;/em&gt; per generare un file &lt;em&gt;.sql &lt;/em&gt;da scambiare con gli altri membri del team o eventualmente da aggiungere su TFS:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/8f18e8ce678b_12CCB/image_10.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/8f18e8ce678b_12CCB/image_thumb_4.png" width="244" height="120" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Utilizzando SQL Management Studio possiamo vedere come il database sia stato creato secondo le nostre specifiche (le colonne sono state aggiunge utilizzando le convenzioni di EF):&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/8f18e8ce678b_12CCB/image_12.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/8f18e8ce678b_12CCB/image_thumb_5.png" width="244" height="237" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;
  &lt;/p&gt;&lt;p&gt;Prima di continuare, facciamo un passo indietro e  “spulciamo” il contenuto della classe &lt;em&gt;OfficeDBFirstMigration&lt;/em&gt; generata dal comando &lt;em&gt;Add-Migration&lt;/em&gt;:&lt;/p&gt;

  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; OfficeDBFirstMigration : DbMigration
{
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Up()
    {
        CreateTable(
            &lt;span class="str"&gt;"Employees"&lt;/span&gt;,
            c =&amp;gt; &lt;span class="kwrd"&gt;new&lt;/span&gt;
                {
                    Id = c.Int(nullable: &lt;span class="kwrd"&gt;false&lt;/span&gt;, identity: &lt;span class="kwrd"&gt;true&lt;/span&gt;),
                    Name = c.String(),
                    Surname = c.String(),
                    Role = c.String(),
                })
            .PrimaryKey(t =&amp;gt; t.Id);
        CreateTable(
            &lt;span class="str"&gt;"EdmMetadata"&lt;/span&gt;,
            c =&amp;gt; &lt;span class="kwrd"&gt;new&lt;/span&gt;
                {
                    Id = c.Int(nullable: &lt;span class="kwrd"&gt;false&lt;/span&gt;, identity: &lt;span class="kwrd"&gt;true&lt;/span&gt;),
                    ModelHash = c.String(),
                })
            .PrimaryKey(t =&amp;gt; t.Id);
        Sql(&lt;span class="str"&gt;"INSERT INTO Employees ([Name],[Surname],[Role]) VALUES ('Pietro','Libro','Art Director')"&lt;/span&gt;);
        Sql(&lt;span class="str"&gt;"INSERT INTO Employees ([Name],[Surname],[Role]) VALUES ('Mario','Rossi','Administrator')"&lt;/span&gt;);
        Sql(&lt;span class="str"&gt;"INSERT INTO Employees ([Name],[Surname],[Role]) VALUES ('Giulio','Verdi','Store Manager')"&lt;/span&gt;);
    }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Down()
    {
        DropTable(&lt;span class="str"&gt;"EdmMetadata"&lt;/span&gt;);
        DropTable(&lt;span class="str"&gt;"Employees"&lt;/span&gt;);
    }
}&lt;/pre&gt;
  &lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

  &lt;p&gt;Nella classe è stato generato l’override dei metodi &lt;em&gt;Up&lt;/em&gt; e &lt;em&gt;Down &lt;/em&gt;(sembra il motivo di una canzone di qualche anno fa &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Sorriso" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/8f18e8ce678b_12CCB/wlEmoticon-smile_2.png" /&gt; ) . &lt;em&gt;Up&lt;/em&gt;, come è facile intuire, contiene il codice eseguito per l’esecuzione dell’upgrade dello schema della base dati, &lt;em&gt;Down&lt;/em&gt;, il codice eseguito per effettuare  il downgrade ad una versione precedente della base dati. La lettura del codice è abbastanza semplice, ed in questo punto possiamo intervenire per specificare manualmente (ove necessario) quanto non automaticamente generato da VS: ad esempio avremmo potuto aggiungere del codice per specificare degli indici  (automatico per le chiavi primarie, Id nello specifico) o delle&lt;em&gt; &lt;/em&gt;Foreign Key. Inoltre possiamo aggiungere del codice SQL personalizzato utilizzando il metodo SQL (…). Utilizziamo questo metodo per aggiungere tre righe alla tabella &lt;em&gt;Employees&lt;/em&gt;. &lt;/p&gt;

  &lt;p&gt;Eseguendo il nostro progetto , il risultato che otteniamo è mostrato figura:&lt;/p&gt;

  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/8f18e8ce678b_12CCB/image_16.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/8f18e8ce678b_12CCB/image_thumb_7.png" width="244" height="132" /&gt;&lt;/a&gt;&lt;/p&gt;

  &lt;p&gt;Modifichiamo il modello dati, nello specifico l’entità &lt;em&gt;Employee&lt;/em&gt;: aggiungiamo la colonna &lt;em&gt;CardID&lt;/em&gt; (di tipo stringa) contenente il numero identificativo stampato sul badge di ogni dipendente, ed impostiamo tramite &lt;em&gt;override&lt;/em&gt; dell’&lt;em&gt;OnModelBuilder&lt;/em&gt; la lunghezza massima del campo a 20 caratteri. Inizialmente tutti i dipendenti dovranno avere un identificativo del tipo “00000-00000”. Procediamo con il comando &lt;em&gt;Add-Migration OfficeDBSecondMigration&lt;/em&gt;, per aggiungere un nuovo piano di migrazione, ovvero un nuovo file .cs del tipo &lt;em&gt;xxxxxx_OfficeDBSecondMigration.cs&lt;/em&gt;, che andiamo immediatamente ad ispezionare per aggiungere del codice personalizzato (per impostare il d&lt;em&gt;efault value&lt;/em&gt;) prima di procedere con l’aggiornamento:&lt;/p&gt;

  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; OfficeDBsecondMigration : DbMigration
{
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Up()
    {
        AddColumn(&lt;span class="str"&gt;"Employees"&lt;/span&gt;, &lt;span class="str"&gt;"CardID"&lt;/span&gt;, c =&amp;gt; c.String(nullable: &lt;span class="kwrd"&gt;false&lt;/span&gt;, defaultValue: &lt;span class="str"&gt;"00000-00000"&lt;/span&gt;, maxLength:20));
    }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Down()
    {
        DropColumn(&lt;span class="str"&gt;"Employees"&lt;/span&gt;, &lt;span class="str"&gt;"CardID"&lt;/span&gt;);
    }
}&lt;/pre&gt;
  &lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;



&lt;p&gt;(Nota: invertendo l’ordine tra d&lt;em&gt;efaultValue&lt;/em&gt; e &lt;em&gt;maxLength &lt;/em&gt;sull’ambiente di test viene sollevata un’eccezione &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-sadsmile" alt="Triste" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/8f18e8ce678b_12CCB/wlEmoticon-sadsmile_2.png" /&gt;, d’altra parte non sarebbe una beta &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Sorriso" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/8f18e8ce678b_12CCB/wlEmoticon-smile_2.png" /&gt;). Procediamo con l’aggiornamento (Up&lt;em&gt;date-Database&lt;/em&gt;). Vediamo cosa è successo: &lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/8f18e8ce678b_12CCB/image_18.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/8f18e8ce678b_12CCB/image_thumb_8.png" width="244" height="81" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quello che ci aspettavamo. Utilizzando solo Code First, questo processo di aggiornamento sarebbe risultato distruttivo e comunque avrebbe richiesto un certo &lt;em&gt;effort &lt;/em&gt;di modifiche “a manina”. Prima di concludere cerchiamo di aumentare la complessità del modello aggiungendo una tabella &lt;em&gt;Roles &lt;/em&gt;ed una relazione uno-a-molti tra le entità &lt;em&gt;Employee&lt;/em&gt; e &lt;em&gt;Role:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/8f18e8ce678b_12CCB/image_20.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/8f18e8ce678b_12CCB/image_thumb_9.png" width="244" height="110" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mettiamo &lt;em&gt;in pending&lt;/em&gt; il nuovo schema dati (&lt;em&gt;Add-Migration OfficeDBThirdMigration&lt;/em&gt;):&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; OfficeDBThirdMigration : DbMigration
{
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Up()
    {
        CreateTable(
            &lt;span class="str"&gt;"Roles"&lt;/span&gt;,
            c =&amp;gt; &lt;span class="kwrd"&gt;new&lt;/span&gt;
                {
                    Id = c.Int(nullable: &lt;span class="kwrd"&gt;false&lt;/span&gt;, identity: &lt;span class="kwrd"&gt;true&lt;/span&gt;),
                    Description = c.String(),
                })
            .PrimaryKey(t =&amp;gt; t.Id);
        AddColumn(&lt;span class="str"&gt;"Employees"&lt;/span&gt;, &lt;span class="str"&gt;"Role_Id"&lt;/span&gt;, c =&amp;gt; c.Int());
        AddForeignKey(&lt;span class="str"&gt;"Employees"&lt;/span&gt;, &lt;span class="str"&gt;"Role_Id"&lt;/span&gt;, &lt;span class="str"&gt;"Roles"&lt;/span&gt;, &lt;span class="str"&gt;"Id"&lt;/span&gt;);
        CreateIndex(&lt;span class="str"&gt;"Employees"&lt;/span&gt;, &lt;span class="str"&gt;"Role_Id"&lt;/span&gt;);
        DropColumn(&lt;span class="str"&gt;"Employees"&lt;/span&gt;, &lt;span class="str"&gt;"Role"&lt;/span&gt;);
        Sql(&lt;span class="str"&gt;"INSERT INTO Roles (Description) VALUES ('Administrator')"&lt;/span&gt;);
        Sql(&lt;span class="str"&gt;"INSERT INTO Roles (Description) VALUES ('Store Manager')"&lt;/span&gt;);
        Sql(&lt;span class="str"&gt;"INSERT INTO Roles (Description) VALUES ('Art Director')"&lt;/span&gt;);
        Sql(&lt;span class="str"&gt;"UPDATE Employees SET Role_ID = 1 WHERE Name='Mario' AND Surname ='Rossi'"&lt;/span&gt;);
        Sql(&lt;span class="str"&gt;"UPDATE Employees SET Role_ID = 2 WHERE Name='Giulio' AND Surname ='Verdi'"&lt;/span&gt;);
        Sql(&lt;span class="str"&gt;"UPDATE Employees SET Role_ID = 3 WHERE Name='Pietro' AND Surname ='Libro'"&lt;/span&gt;);
    }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Down()
    {
        AddColumn(&lt;span class="str"&gt;"Employees"&lt;/span&gt;, &lt;span class="str"&gt;"Role"&lt;/span&gt;, c =&amp;gt; c.String());
        DropIndex(&lt;span class="str"&gt;"Employees"&lt;/span&gt;, &lt;span class="kwrd"&gt;new&lt;/span&gt;[] { &lt;span class="str"&gt;"Role_Id"&lt;/span&gt; });
        DropForeignKey(&lt;span class="str"&gt;"Employees"&lt;/span&gt;, &lt;span class="str"&gt;"Role_Id"&lt;/span&gt;, &lt;span class="str"&gt;"Roles"&lt;/span&gt;, &lt;span class="str"&gt;"Id"&lt;/span&gt;);
        DropColumn(&lt;span class="str"&gt;"Employees"&lt;/span&gt;, &lt;span class="str"&gt;"Role_Id"&lt;/span&gt;);
        DropTable(&lt;span class="str"&gt;"Roles"&lt;/span&gt;);
    }
}&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;A cui abbiamo aggiunto del codice SQL custom. Un ultimo &lt;em&gt;Update-Database&lt;/em&gt; ed il gioco è fatto:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/8f18e8ce678b_12CCB/image_22.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/8f18e8ce678b_12CCB/image_thumb_10.png" width="192" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Il risultato ovviamente non cambia &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Sorriso" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/8f18e8ce678b_12CCB/wlEmoticon-smile_2.png" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/8f18e8ce678b_12CCB/image_24.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/8f18e8ce678b_12CCB/image_thumb_11.png" width="244" height="85" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Per eseguire l’upgrade-downgrade del modello dati è sufficiente invocare il metodo&lt;em&gt; Update-Database –targetmigration [parametro] &lt;/em&gt;dove &lt;em&gt;[parametro]&lt;/em&gt; è uno dei nomi utilizzati in precedenza (ad esempio &lt;em&gt;OfficeDBFirstMigration&lt;/em&gt; ). Vedremo nel prossimo post il funzionamento della modalità “automatica” di migrazione.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/100590.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2011/12/01/ef-code-first-migrations-beta-1-parte-1.aspx</guid>
            <pubDate>Thu, 01 Dec 2011 21:59:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2011/12/01/ef-code-first-migrations-beta-1-parte-1.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/100590.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/100590.aspx</trackback:ping>
        </item>
        <item>
            <title>Code First Migrations: Beta 1 Released</title>
            <category>Entity Framework 4.1</category>
            <category>C#</category>
            <category>Code First Migrations</category>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2011/11/30/code-first-migrations-beta-1-released.aspx</link>
            <description>&lt;p&gt;Rilasciata la versione Beta 1 di Code First Migrations. Tutti i dettagli &lt;a target="_blank" href="http://blogs.msdn.com/b/adonet/archive/2011/11/29/code-first-migrations-beta-1-released.aspx"&gt;qui&lt;/a&gt;. La semplicità di utilizzo è veramente notevole &lt;img src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Code-First-Migrations-Beta-1-Released_A6E1/wlEmoticon-smile_2.png" alt="Sorriso" class="wlEmoticon wlEmoticon-smile" style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" /&gt;.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/100581.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2011/11/30/code-first-migrations-beta-1-released.aspx</guid>
            <pubDate>Wed, 30 Nov 2011 10:52:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2011/11/30/code-first-migrations-beta-1-released.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/100581.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/100581.aspx</trackback:ping>
        </item>
        <item>
            <title>Expression, LambdaExpression, Entity Framework (e DDD)</title>
            <category>Entity Framework 4.1</category>
            <category>Entity Framework 4.2</category>
            <category>C#</category>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2011/11/10/expression-lambdaexpression-entity-framework-e-ddd.aspx</link>
            <description>&lt;p&gt;Se lavoriamo con EF utilizzando l’approccio Code First, in alcuni scenari,  il &lt;em&gt;mapping&lt;/em&gt; (ad esempio nel caso di classi di dominio già esistenti) potrebbe essere un task non banale. Riprendiamo un esempio di &lt;a href="http://blogs.ugidotnet.org/PietroLibroBlog/archive/2011/04/04/ef-code-first-e-ddd.aspx" target="_blank"&gt;qualche tempo fa&lt;/a&gt; , aggiungendo all’Object Model l’entità &lt;em&gt;Articolo&lt;/em&gt;, come riassunto dal Class Diagram seguente:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Expression-Lambda-Entity-Framework_5A2F/image_2.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Expression-Lambda-Entity-Framework_5A2F/image_thumb.png" width="359" height="152" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Fattura &lt;/em&gt;espone una collezione di oggetti &lt;em&gt;RigoFattura  &lt;/em&gt;accessibile (dall’esterno) tramite &lt;em&gt;l’IEnumerable&amp;lt;RigoFattura&amp;gt;  &lt;/em&gt;pertanto, l’unico modo di aggiungere nuove righe alla fattura è l’utilizzo del metodo &lt;em&gt;AddRigoFattura&lt;/em&gt;. Ancora, la classe &lt;em&gt;RigoFattura &lt;/em&gt;contiene una proprietà &lt;em&gt;CodiceArticolo &lt;/em&gt;che ritorna la proprietà &lt;em&gt;Codice &lt;/em&gt;dell’istanza della classe &lt;em&gt;Articolo &lt;/em&gt;referenziata, ma anche in questo caso, l’unico modo per aggiungere un Articolo  è tramite un metodo : &lt;em&gt;ImpostaArticolo&lt;/em&gt;.  A questo punto qualcuno potrebbe dire, “Si ok, ma dov’è il problema ?” Come descritto nel post precedente, durante il &lt;em&gt;mapping, &lt;/em&gt;nell’&lt;em&gt;override &lt;/em&gt;dell’&lt;em&gt;OnModelBuilder&lt;/em&gt;, abbiamo qualche problema in fase di compilazione:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Expression-Lambda-Entity-Framework_5A2F/image_4.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Expression-Lambda-Entity-Framework_5A2F/image_thumb_1.png" width="347" height="161" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Questo perché le Fluent API, come è facile intuire, non vanno d’accordo con i membri &lt;em&gt;Protected &lt;/em&gt;(o comunque non accessibili dall’esterno)&lt;em&gt;.&lt;/em&gt; In questi casi, la soluzione che possiamo adottare è quella di creare una serie di &lt;em&gt;Extension Methods &lt;/em&gt;che basandosi sul nome delle Proprietà e Navigation Properties ci permettano di creare delle espressioni da poter utilizzare nel nostro scenario di &lt;em&gt;mapping&lt;/em&gt;:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Methods
{
    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Expression&amp;lt;Func&amp;lt;T, K&amp;gt;&amp;gt; CreateExpression&amp;lt;T, K&amp;gt;(String propertyName)
    {
        Type type = &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(T);
        PropertyInfo pi = type.GetProperty(propertyName, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (pi == &lt;span class="kwrd"&gt;null&lt;/span&gt;) &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ArgumentException(&lt;span class="str"&gt;"propertyName is not valid."&lt;/span&gt;);
        ParameterExpression argumentExpression = Expression.Parameter(type, &lt;span class="str"&gt;"x"&lt;/span&gt;);
        MemberExpression memberExpression = Expression.Property(argumentExpression, pi);
        LambdaExpression lambda = Expression.Lambda(memberExpression, argumentExpression);
        Expression&amp;lt;Func&amp;lt;T, K&amp;gt;&amp;gt; expression = (Expression&amp;lt;Func&amp;lt;T, K&amp;gt;&amp;gt;)lambda;

        &lt;span class="kwrd"&gt;return&lt;/span&gt; expression;
    }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; PrimitivePropertyConfiguration Property&amp;lt;TEntity, KPropertyType&amp;gt;(&lt;span class="kwrd"&gt;this&lt;/span&gt; EntityTypeConfiguration&amp;lt;TEntity&amp;gt; mapper, String propertyName)
        &lt;span class="kwrd"&gt;where&lt;/span&gt; TEntity : &lt;span class="kwrd"&gt;class&lt;/span&gt;
        &lt;span class="kwrd"&gt;where&lt;/span&gt; KPropertyType : &lt;span class="kwrd"&gt;struct&lt;/span&gt;
    {
        Expression&amp;lt;Func&amp;lt;TEntity, KPropertyType&amp;gt;&amp;gt; expression = CreateExpression&amp;lt;TEntity, KPropertyType&amp;gt;(propertyName);
        &lt;span class="kwrd"&gt;return&lt;/span&gt; mapper.Property(expression);
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; DependentNavigationPropertyConfiguration&amp;lt;TEntity&amp;gt; WithMany&amp;lt;TEntity, KTargetEntity&amp;gt;(
        &lt;span class="kwrd"&gt;this&lt;/span&gt;  OptionalNavigationPropertyConfiguration&amp;lt;TEntity, KTargetEntity&amp;gt; mapper, String propertyName)
        &lt;span class="kwrd"&gt;where&lt;/span&gt; TEntity : &lt;span class="kwrd"&gt;class&lt;/span&gt;
        &lt;span class="kwrd"&gt;where&lt;/span&gt; KTargetEntity : &lt;span class="kwrd"&gt;class&lt;/span&gt;
    {
        Type type = &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(KTargetEntity);
        ParameterExpression argumentExpression = Expression.Parameter(type, &lt;span class="str"&gt;"x"&lt;/span&gt;);
        PropertyInfo pi = type.GetProperty(propertyName, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
        MemberExpression memberExpression = Expression.Property(argumentExpression, pi);
        LambdaExpression lambda = Expression.Lambda(memberExpression, argumentExpression);
        var expression = (Expression&amp;lt;Func&amp;lt;KTargetEntity, ICollection&amp;lt;TEntity&amp;gt;&amp;gt;&amp;gt;)lambda;

        &lt;span class="kwrd"&gt;return&lt;/span&gt; mapper.WithMany(expression);
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; RequiredNavigationPropertyConfiguration&amp;lt;TEntity, TTargetEntity&amp;gt; HasRequired&amp;lt;TEntity, TTargetEntity&amp;gt;(&lt;span class="kwrd"&gt;this&lt;/span&gt; EntityTypeConfiguration&amp;lt;TEntity&amp;gt; mapper, String propertyName)
        &lt;span class="kwrd"&gt;where&lt;/span&gt; TEntity : &lt;span class="kwrd"&gt;class&lt;/span&gt;
        &lt;span class="kwrd"&gt;where&lt;/span&gt; TTargetEntity : &lt;span class="kwrd"&gt;class&lt;/span&gt;
    {
        Expression&amp;lt;Func&amp;lt;TEntity, TTargetEntity&amp;gt;&amp;gt; expression = CreateExpression&amp;lt;TEntity, TTargetEntity&amp;gt;(propertyName);
        &lt;span class="kwrd"&gt;return&lt;/span&gt; mapper.HasRequired(expression);
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; EntityTypeConfiguration&amp;lt;TEntity&amp;gt; HasKey&amp;lt;TEntity, KKeyType&amp;gt;(&lt;span class="kwrd"&gt;this&lt;/span&gt; EntityTypeConfiguration&amp;lt;TEntity&amp;gt; mapper, String propertyName)
        &lt;span class="kwrd"&gt;where&lt;/span&gt; TEntity : &lt;span class="kwrd"&gt;class&lt;/span&gt;
        &lt;span class="kwrd"&gt;where&lt;/span&gt; KKeyType : &lt;span class="kwrd"&gt;struct&lt;/span&gt;
    {
        Expression&amp;lt;Func&amp;lt;TEntity, KKeyType&amp;gt;&amp;gt; expression = CreateExpression&amp;lt;TEntity, KKeyType&amp;gt;(propertyName);
        EntityTypeConfiguration&amp;lt;TEntity&amp;gt; m = mapper.HasKey&amp;lt;KKeyType&amp;gt;(expression);
        &lt;span class="kwrd"&gt;return&lt;/span&gt; mapper;
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; ManyNavigationPropertyConfiguration&amp;lt;T, U&amp;gt; HasMany&amp;lt;T, U&amp;gt;(&lt;span class="kwrd"&gt;this&lt;/span&gt; EntityTypeConfiguration&amp;lt;T&amp;gt; mapper, String propertyName)
        &lt;span class="kwrd"&gt;where&lt;/span&gt; T : &lt;span class="kwrd"&gt;class&lt;/span&gt;
        &lt;span class="kwrd"&gt;where&lt;/span&gt; U : &lt;span class="kwrd"&gt;class&lt;/span&gt;
    {
        Type type = &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(T);
        PropertyInfo pi = type.GetProperty(propertyName, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (pi == &lt;span class="kwrd"&gt;null&lt;/span&gt;) &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ArgumentException(&lt;span class="str"&gt;"propertyName is not valid."&lt;/span&gt;);
        ParameterExpression parameterExpression = Expression.Parameter(type, &lt;span class="str"&gt;"x"&lt;/span&gt;);
        MemberExpression memberExpression = Expression.Property(parameterExpression, pi);
        LambdaExpression lambda = Expression.Lambda(memberExpression, parameterExpression);
        Expression&amp;lt;Func&amp;lt;T, ICollection&amp;lt;U&amp;gt;&amp;gt;&amp;gt; expression = (Expression&amp;lt;Func&amp;lt;T, ICollection&amp;lt;U&amp;gt;&amp;gt;&amp;gt;)lambda;
        
        &lt;span class="kwrd"&gt;return&lt;/span&gt; mapper.HasMany(expression);
    }&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;A questo punto il gioco è facile, definendo il modello in questo modo:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity&amp;lt;RigoFattura&amp;gt;();
    modelBuilder.Entity&amp;lt;RigoFattura&amp;gt;().ToTable(&lt;span class="str"&gt;"RigoFattura"&lt;/span&gt;);
    modelBuilder.Entity&amp;lt;RigoFattura&amp;gt;().Ignore(rf =&amp;gt; rf.CodiceArticolo);

    modelBuilder.Entity&amp;lt;RigoFattura&amp;gt;().HasRequired&amp;lt;RigoFattura, Articolo&amp;gt;(&lt;span class="str"&gt;"Articolo"&lt;/span&gt;);            

    modelBuilder.Entity&amp;lt;Fattura&amp;gt;().ToTable(&lt;span class="str"&gt;"Fattura"&lt;/span&gt;);
    modelBuilder.Entity&amp;lt;Fattura&amp;gt;().HasKey&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt;(f =&amp;gt; f.Numero);
    modelBuilder.Entity&amp;lt;Fattura&amp;gt;().HasMany&amp;lt;Fattura, RigoFattura&amp;gt;(&lt;span class="str"&gt;"RigheFatture"&lt;/span&gt;);

    modelBuilder.Entity&amp;lt;Articolo&amp;gt;().ToTable(&lt;span class="str"&gt;"Articoli"&lt;/span&gt;);
    modelBuilder.Entity&amp;lt;Articolo&amp;gt;().HasKey(a =&amp;gt; a.Codice);            
}   &lt;/pre&gt;

&lt;p /&gt;&lt;style type="text/css"&gt;&lt;![CDATA[

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;Tutto funziona correttamente, e l’esecuzione del codice porta alla corretta creazione del Database come riassunto dal &lt;em&gt;Database Diagram &lt;/em&gt;seguente:

&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Expression-Lambda-Entity-Framework_5A2F/image_6.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Expression-Lambda-Entity-Framework_5A2F/image_thumb_2.png" width="302" height="180" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gli &lt;em&gt;Extension Methods &lt;/em&gt;descritti in precedenza, non servono solo a coprire lo scenario descritto nel post, ma anche nel caso di : WithMany, HasKey, HasMany, Property ecc… Aggiungere altri metodi personalizzati è relativamente semplice. Cosa facciamo nel codice: 1) tramite &lt;em&gt;reflection &lt;/em&gt;recuperiamo le proprietà che entrano in gioco durante lo scenario di &lt;em&gt;mapping&lt;/em&gt; e che non sono visibili dall’esterno 2) Creiamo una &lt;em&gt;ParameterExpression&lt;/em&gt; con il tipo entità (TEntity) 3) Creiamo una &lt;em&gt;MemberExpression&lt;/em&gt; a partire dalla proprietà ottenuta via &lt;em&gt;reflection&lt;/em&gt; e dalla &lt;em&gt;ParameterExpression&lt;/em&gt; ottenuta al punto precedente 3) Mettiamo tutto insieme, creiamo una &lt;em&gt;Lambda Expression&lt;/em&gt; e da questa una &lt;em&gt;Expression&amp;lt;Func&amp;lt;,&amp;gt;&amp;gt;&lt;/em&gt; accettata dal  &lt;em&gt;mapper&lt;/em&gt;. In tre “semplici” passi aggiungiamo uno “strato” che ci permette di coprire scenari di &lt;em&gt;mapping &lt;/em&gt;“ostici”.&lt;/p&gt;

&lt;p&gt;Nota bene: questo post non vuole essere in contraddizione con quanto precedentemente scritto a proposito di DDD ed EF, ma presenta solo un &lt;em&gt;workaround&lt;/em&gt; per bypassare il problema, ma con tutte le problematiche del caso: di solito le parole “Stringhe” e “Refactoring” non vanno molto d’accordo (se ad esempio cambiamo il nome di una proprietà di una classe, la stringa associata non viene cambiata, creando una “fantastica” eccezione a runtime). Si spera che le prossime release di Entity Framework permettano di risolvere anche questo scoglio. &lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/100510.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2011/11/10/expression-lambdaexpression-entity-framework-e-ddd.aspx</guid>
            <pubDate>Thu, 10 Nov 2011 06:11:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2011/11/10/expression-lambdaexpression-entity-framework-e-ddd.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/100510.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/100510.aspx</trackback:ping>
        </item>
        <item>
            <title>EF 4.2 Released</title>
            <category>Entity Framework 4.2</category>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2011/11/02/ef-4.2-released.aspx</link>
            <description>E' stata rilasciata la versione finale di EF 4.2 contenente aggiornamenti riguardanti il DbContext ed il Code First runtime. L'utilizzo degli Enum, Spatial Data-Type ecc...(&lt;a href="http://blogs.msdn.com/b/adonet/archive/2011/06/30/announcing-the-microsoft-entity-framework-june-2011-ctp.aspx"&gt;vedi EF June CTP 2011&lt;/a&gt;) non è incluso in questo aggiornamento, in quanto richiederebbe delle modifiche alle librerie del .Net Framework. Il download di EF 4.2 è disponibile via NuGet.&lt;br /&gt;
Al solito, per maggiori dettagli: &lt;a href="http://blogs.msdn.com/b/adonet/archive/2011/11/01/ef-4-2-released.aspx"&gt;ADO.NET team blog&lt;/a&gt;.&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/100488.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2011/11/02/ef-4.2-released.aspx</guid>
            <pubDate>Wed, 02 Nov 2011 07:21:51 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2011/11/02/ef-4.2-released.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/100488.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/100488.aspx</trackback:ping>
        </item>
        <item>
            <title>EF 4.2 Release Candidate</title>
            <category>Entity Framework 4.1</category>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2011/10/11/ef-4.2-release-candidate.aspx</link>
            <description>&lt;p&gt;E’ stata rilasciata la versione 4.2 Release Candidate di Entity Framework. Tutti i dettagli relativi &lt;a href="http://blogs.msdn.com/b/adonet/archive/2011/09/28/ef-4-2-release-candidate-available.aspx" target="_blank"&gt;qui&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/100442.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2011/10/11/ef-4.2-release-candidate.aspx</guid>
            <pubDate>Tue, 11 Oct 2011 06:07:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2011/10/11/ef-4.2-release-candidate.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/100442.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/100442.aspx</trackback:ping>
        </item>
        <item>
            <title>DomusDotNet : Pomeriggio Entity Framework</title>
            <category>Varie ed eventuali</category>
            <category>Entity Framework 4.1</category>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2011/10/11/domusdotnet-pomeriggio-entity-framework.aspx</link>
            <description>&lt;p&gt;Venerdì 7 ottobre si è tenuto l’evento &lt;a href="http://www.domusdotnet.org/eventi/pomeriggio-ef.aspx" target="_blank"&gt;Pomeriggio Entity Framework&lt;/a&gt; organizzato da &lt;a href="http://www.domusdotnet.org/" target="_blank"&gt;DomusDotNet&lt;/a&gt;. L’argomento sembra aver suscitato un certo interesse dato il numero di presenze. Si è discusso dei vari approcci di utilizzo dell’O\RM di Casa Microsoft : Database First &amp;amp; Model First, &lt;em&gt;Alessandro Mostarda, &lt;/em&gt;Code First (io, nonostante non fosse la mia prima esperienza da Speaker era la prima volta in casa Microsoft &lt;img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-smile" alt="Sorriso" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/DomusDotNet--Pomeriggio-Entity-Framework_66BC/wlEmoticon-smile_2.png" /&gt;) , WP7  e Database Locali (&lt;a href="http://blogs.ugidotnet.org/Nick60/Default.aspx" target="_blank"&gt;Nicolò&lt;/a&gt;). Grazie a tutti partecipanti !!! A presto! Qualche foto dell’evento:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/DomusDotNet--Pomeriggio-Entity-Framework_66BC/IMG_1123.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="IMG_1123" border="0" alt="IMG_1123" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/DomusDotNet--Pomeriggio-Entity-Framework_66BC/IMG_1123_thumb.jpg" width="184" height="244" /&gt;&lt;/a&gt; &lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/DomusDotNet--Pomeriggio-Entity-Framework_66BC/IMG_1118.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="IMG_1118" border="0" alt="IMG_1118" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/DomusDotNet--Pomeriggio-Entity-Framework_66BC/IMG_1118_thumb.jpg" width="244" height="184" /&gt;&lt;/a&gt; &lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/DomusDotNet--Pomeriggio-Entity-Framework_66BC/IMG_1119.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="IMG_1119" border="0" alt="IMG_1119" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/DomusDotNet--Pomeriggio-Entity-Framework_66BC/IMG_1119_thumb.jpg" width="244" height="184" /&gt;&lt;/a&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/DomusDotNet--Pomeriggio-Entity-Framework_66BC/IMG_1127.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="IMG_1127" border="0" alt="IMG_1127" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/DomusDotNet--Pomeriggio-Entity-Framework_66BC/IMG_1127_thumb.jpg" width="244" height="184" /&gt;&lt;/a&gt;&lt;/p&gt;        &lt;p&gt; &lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/DomusDotNet--Pomeriggio-Entity-Framework_66BC/IMG_1128.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="IMG_1128" border="0" alt="IMG_1128" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/DomusDotNet--Pomeriggio-Entity-Framework_66BC/IMG_1128_thumb.jpg" width="244" height="184" /&gt;&lt;/a&gt; &lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/DomusDotNet--Pomeriggio-Entity-Framework_66BC/IMG_1140.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="IMG_1140" border="0" alt="IMG_1140" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/DomusDotNet--Pomeriggio-Entity-Framework_66BC/IMG_1140_thumb.jpg" width="244" height="184" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Da sinistra verso destra: Vela DomusDotNet, Nick 1 e 2, Alessandro, Io 3 e 4. Alla prossima !&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/100441.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2011/10/11/domusdotnet-pomeriggio-entity-framework.aspx</guid>
            <pubDate>Tue, 11 Oct 2011 05:28:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2011/10/11/domusdotnet-pomeriggio-entity-framework.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/100441.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/100441.aspx</trackback:ping>
        </item>
        <item>
            <title>Code First Migrations: Alpha 2 Released</title>
            <category>C#</category>
            <category>Entity Framework 4.1</category>
            <category>.Net Framework 4.0</category>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2011/09/08/code-first-migrations-alpha-2-released.aspx</link>
            <description>&lt;p&gt;Maggiori info ed un dettagliato &lt;em&gt;Walkthrough&lt;/em&gt; &lt;a href="http://blogs.msdn.com/b/adonet/archive/2011/09/06/code-first-migrations-alpha-2-walkthrough.aspx" target="_blank"&gt;qui&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/100330.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2011/09/08/code-first-migrations-alpha-2-released.aspx</guid>
            <pubDate>Thu, 08 Sep 2011 09:05:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2011/09/08/code-first-migrations-alpha-2-released.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/100330.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/100330.aspx</trackback:ping>
        </item>
    </channel>
</rss>
