<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>Entity Framework 4</title>
        <link>http://blogs.ugidotnet.org/pietrolibroblog/category/Entity Framework 4.aspx</link>
        <description>Entity Framework 4</description>
        <language>it-IT</language>
        <copyright>Pietro Libro</copyright>
        <managingEditor>pietro.libro@libero.it</managingEditor>
        <generator>Subtext Version 2.6.0.0</generator>
        <item>
            <title>EF6 (beta1) - Code First Stored Procedures Mapping</title>
            <link>http://blogs.ugidotnet.org/pietrolibroblog/archive/2013/06/26/ef6-beta1-code-first-stored-procedures-mapping.aspx</link>
            <description>&lt;p&gt;Una delle features che sicuramente in molti aspettavano con la nuova release di EF è la possibilità di eseguire il mapping delle entità tramite Stored Procedures. Con la versione 6 di Entity Framework (attualmente in beta 1), abbiamo finalmente questa possibilità, e l'utilizzo è veramente immediato.&lt;/p&gt;  &lt;p&gt;Supponiamo di avere un Domain Model simile a quello mostrato nella figura seguente:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/EF6beta1CodeFirstStoredProceduresMapping_8648/image_2.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/EF6beta1CodeFirstStoredProceduresMapping_8648/image_thumb.png" width="206" height="244" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Dove abbiamo un insieme di oggetti ereditati, ed una &lt;em&gt;navigation property &lt;/em&gt;che collega l'oggeto &lt;em&gt;Car&lt;/em&gt; ad una collezione di oggetti &lt;em&gt;Optional&lt;/em&gt;. &lt;/p&gt;  &lt;p&gt;Aggiungiamo il riferimento ad EF6 utilizzando il gestore di "NuGet Packages" selezionando tra le varie opzioni "Include Prerelease" e poi selezioniamo il package "Entity Framework":&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/EF6beta1CodeFirstStoredProceduresMapping_8648/image_4.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/EF6beta1CodeFirstStoredProceduresMapping_8648/image_thumb_1.png" width="244" height="150" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Eseguiamo la configurazione delle classi che compongono il nostro Domain tramite Code First Fluent Api ed aggiungiamo il codice seguente:&lt;/p&gt;  &lt;pre class="csharpcode"&gt; modelBuilder.Entity&amp;lt;Domain.Car&amp;gt;().MapToStoredProcedures();
 modelBuilder.Entity&amp;lt;Domain.Optional&amp;gt;().MapToStoredProcedures();&lt;/pre&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Il quale "informa" il run-time di Entity Framework che per le entità "Car" ed "Optional" le operazioni di Insert\Delete\Update verranno utilizzate delle Stored Procedures (che rispondono alle convenzioni richieste da EF). &lt;/p&gt;

&lt;p&gt;A questo punto entra in scena EF Migrations ed il "fantastico" comando "Add-Migration", che produce tutto il codice, e non solo, necessario ad aggiornare il database:&lt;/p&gt;

&lt;pre class="csharpcode"&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; Up()
        {
            CreateStoredProcedure(
                &lt;span class="str"&gt;"DomusDotNet.Car_Insert"&lt;/span&gt;,
                p =&amp;gt; &lt;span class="kwrd"&gt;new&lt;/span&gt;
                    {
                        Brand = p.String(maxLength: 128),
                        Model = p.String(maxLength: 128),
                        EngineSize = p.String(maxLength: 128),
                        HP = p.Int(),
                        DailyRent = p.Single(),
                        FreeDailyKm = p.Int(),
                        Note = p.String(maxLength: 128),
                    },
                body:
                    &lt;span class="str"&gt;@"INSERT [DomusDotNet].[Vehicles]([Brand], [Model], [EngineSize], [HP], [DailyRent], [FreeDailyKm], [Note])
                      VALUES (@Brand, @Model, @EngineSize, @HP, @DailyRent, @FreeDailyKm, @Note)
                      
                      DECLARE @Id int
                      SELECT @Id = [Id]
                      FROM [DomusDotNet].[Vehicles]
                      WHERE @@ROWCOUNT &amp;gt; 0 and [Id] = scope_identity()
                      
                      INSERT [DomusDotNet].[Cars]([Id])
                      VALUES (@Id)
                      
                      SELECT t0.[Id]
                      FROM [DomusDotNet].[Vehicles] as t0
                      WHERE @@ROWCOUNT &amp;gt; 0 and t0.[Id] = @Id"&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;Unico neo, se utilizzate uno schema diverso da "dbo" (anche se avete specificato tramite la nuova API HasDefaultSchema("...") lo schema corretto) bisogna modificare manualmente il nome delle Stored Procedures, altrimenti a run-time verrà generata un'eccezione.&lt;/p&gt;

&lt;p&gt;Scriviamo del codice di test tipo:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;int&lt;/span&gt; rowsAffected = 0;

Domain.Car fordFocus = &lt;span class="kwrd"&gt;new&lt;/span&gt; Domain.Car()
{
    Brand = &lt;span class="str"&gt;"FORD"&lt;/span&gt;,
    DailyRent = 45.0f,
    EngineSize = &lt;span class="str"&gt;"1600"&lt;/span&gt;,
    FreeDailyKm = 100,
    HP = 115,
    Model = &lt;span class="str"&gt;"Focus"&lt;/span&gt;,
    Note = &lt;span class="str"&gt;"With Radio and Power Steering."&lt;/span&gt;
};

fordFocus.Optionals.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; Domain.Accesory() { Description = &lt;span class="str"&gt;"Radio Sony"&lt;/span&gt;, Removable = &lt;span class="kwrd"&gt;true&lt;/span&gt;, Price = 10 });
fordFocus.Optionals.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; Domain.Accesory() { Description = &lt;span class="str"&gt;"Power Steering"&lt;/span&gt;, Removable = &lt;span class="kwrd"&gt;false&lt;/span&gt;, Price = 0 });

&lt;span class="kwrd"&gt;using&lt;/span&gt; (Data.CarRentalDB db = &lt;span class="kwrd"&gt;new&lt;/span&gt; Data.CarRentalDB())
{
    db.Cars.Add(fordFocus);
    rowsAffected = db.SaveChanges();
}&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;Utilizzando il nostro amico "Sql Profiler" vediamo come le operazioni di accesso alla tabella per Insert\Update\Delete utilizzano le Stored Procedures generate in precedenza:

&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/EF6beta1CodeFirstStoredProceduresMapping_8648/image_8.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/EF6beta1CodeFirstStoredProceduresMapping_8648/image_thumb_3.png" width="244" height="130" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Di questo ed altro parleremo in dettaglio durante l'evento &lt;a href="mailto:EF@Work"&gt;EF@Work&lt;/a&gt; organizzato da DomusDotNet :-)&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/pietrolibroblog/aggbug/101596.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/pietrolibroblog/archive/2013/06/26/ef6-beta1-code-first-stored-procedures-mapping.aspx</guid>
            <pubDate>Wed, 26 Jun 2013 10:30:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/pietrolibroblog/archive/2013/06/26/ef6-beta1-code-first-stored-procedures-mapping.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/pietrolibroblog/comments/commentRss/101596.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/pietrolibroblog/services/trackbacks/101596.aspx</trackback:ping>
        </item>
        <item>
            <title>EF Power Tools Beta 2: Prove su strada</title>
            <link>http://blogs.ugidotnet.org/pietrolibroblog/archive/2012/04/11/ef-power-tools-beta-2-prove-su-strada.aspx</link>
            <description>&lt;p&gt;Ero troppo curioso di provare la nuova versione (beta) dei Tools per EF. Diciamo che la curiosità è stata parzialmente ripagata &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/c2771568168c_12AC0/wlEmoticon-smile_2.png" /&gt; dato che con la prima versione non riuscii  a fare granché essendo, almeno nella mia configurazione software, non molto stabile. Andiamo con ordine: dopo aver installato la nuova versione dei Tools, ho provato subito ad eseguire la funzione “Reverse Engineer Code First”  (disponibile come voce di menu contestuale selezionando un progetto C#).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/c2771568168c_12AC0/image_2.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/c2771568168c_12AC0/image_thumb.png" width="293" height="128" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Per l’esperimento ho scelto un database con diverse tabelle, relazioni e “gerarchie”. Dopo aver cliccato sulla voce precedente, VS ha iniziato a “macinare” generando una sfilza di classi, suddividendole opportunatamente in classi di &lt;em&gt;Mapping&lt;/em&gt;, &lt;em&gt;Object Model&lt;/em&gt; e &lt;em&gt;DbContext&lt;/em&gt;:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/c2771568168c_12AC0/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/c2771568168c_12AC0/image_thumb_1.png" width="179" height="244" /&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/c2771568168c_12AC0/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/c2771568168c_12AC0/image_thumb_2.png" width="244" height="205" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;L’operazione è durata pochi secondi. Secondo il post del team di ADO.NET EF, VS avrebbe dovuto scaricare ed installare (se non già presente nel progetto) l’ultima versione di Entity Framework (nello specifico caso non è accaduto, ma con NuGet, anche questa operazione è durata poco &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/c2771568168c_12AC0/wlEmoticon-smile_2.png" /&gt; ). Scorrendo l’elenco delle classi generate noto come il processo di &lt;em&gt;reverse engineering &lt;/em&gt;abbia creato delle classi anche per le tutte le viste presenti sul database. Proviamo ad analizzare “graficamente” il modello ad oggetti creato, selezionando nel &lt;em&gt;Solution Explorer &lt;/em&gt;la classe derivata dal &lt;em&gt;DbContext&lt;/em&gt; e poi la voce “View Entity Data Model (Read Only)”:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/c2771568168c_12AC0/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/c2771568168c_12AC0/image_thumb_3.png" width="244" height="154" /&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/c2771568168c_12AC0/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/c2771568168c_12AC0/image_thumb_5.png" width="244" height="209" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Molte delle classi “isolate” sono proprio le classi\viste generate dal VS. Con le altre opzioni disponibili possiamo, creare il DDL SQL:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/c2771568168c_12AC0/image_14.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/c2771568168c_12AC0/image_thumb_6.png" width="244" height="130" /&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/c2771568168c_12AC0/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/c2771568168c_12AC0/image_thumb_7.png" width="244" height="241" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;e visualizzare &lt;em&gt;l’Entity Data Model XML&lt;/em&gt;:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/c2771568168c_12AC0/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/c2771568168c_12AC0/image_thumb_8.png" width="244" height="142" /&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/c2771568168c_12AC0/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/c2771568168c_12AC0/image_thumb_9.png" width="244" height="131" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Se siamo curiosi, possiamo creare un nuovo database a partire dalle classi generate da VS e poi eseguire uno &lt;em&gt;Schema Compare&lt;/em&gt; per visionare le differenze tra l’originale ed il generato:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/c2771568168c_12AC0/image_22.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/c2771568168c_12AC0/image_thumb_10.png" width="244" height="79" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;                               &lt;/p&gt;&lt;p&gt;A colpo d’occhio mancano, rispetto all’originale, Stored Procedure e Viste, poi analizzando nel dettaglio le varie tabelle possiamo trovare alcune differenze come VARCHAR in NVARCHAR, valori di default mancanti, campi TEXT trasformati in NVARCHAR(MAX). Riassumendo, i Tools sembrano essere abbastanza stabili (rispetto alla versione precedente nessun crash &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/c2771568168c_12AC0/wlEmoticon-smile_2.png" /&gt;) , quello che è certo (almeno fino ad ora) che dovendo partire da un database esistente, sviluppare le classi POCO e &lt;em&gt;DbContext&lt;/em&gt; con questa rapidità non ha prezzo, ma sicuramente è necessario un ulteriore lavoro di “fino” (magari in combinazione con EF Code First Migrations) se l’obiettivo è quello di avere un modello finale “fedele” all’originale, in caso contrario è un ottima base di partenza per un &lt;em&gt;refactoring&lt;/em&gt;.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/pietrolibroblog/aggbug/100945.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/pietrolibroblog/archive/2012/04/11/ef-power-tools-beta-2-prove-su-strada.aspx</guid>
            <pubDate>Wed, 11 Apr 2012 07:53:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/pietrolibroblog/archive/2012/04/11/ef-power-tools-beta-2-prove-su-strada.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/pietrolibroblog/comments/commentRss/100945.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/pietrolibroblog/services/trackbacks/100945.aspx</trackback:ping>
        </item>
        <item>
            <title>DomusDotNet : We Want Web, grazie a tutti :-)</title>
            <link>http://blogs.ugidotnet.org/pietrolibroblog/archive/2012/03/10/domusdotnet-wewantweb-grazie-a-tutti.aspx</link>
            <description>&lt;p&gt;Ieri 9/3/12 si è svolto l’evento WeWantWeb organizzato da DomusDotNet presso la sede Microsoft di Roma. Le sessioni sono state registrare e quanto prima pubblicheremo Slide, codice sorgente degli esempi e Video, sul sito di &lt;a href="http://www.domusdotnet.org/" target="_blank"&gt;DomusDotNet&lt;/a&gt;. Grazie a tutti i partecipanti!!! Attendiamo i vostri feedback! Al prossimo evento &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/7226c6221ecf_11545/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/7226c6221ecf_11545/WP_000309_2.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="Alessandro Mostarda e Massibo Bonanni" border="0" alt="Alessandro Mostarda e Massibo Bonanni" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/7226c6221ecf_11545/WP_000309_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/7226c6221ecf_11545/WP_000311_2.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="Giorgio Di Nardo" border="0" alt="Giorgio Di Nardo" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/7226c6221ecf_11545/WP_000311_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/7226c6221ecf_11545/WP_000317_2.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="Nicolò Carandini" border="0" alt="Nicolò Carandini" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/7226c6221ecf_11545/WP_000317_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/7226c6221ecf_11545/WP_000333_2.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="Pietro Libro" border="0" alt="Pietro Libro" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/7226c6221ecf_11545/WP_000333_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/7226c6221ecf_11545/WP_000307_2.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="WP_000307" border="0" alt="WP_000307" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/7226c6221ecf_11545/WP_000307_thumb.jpg" width="184" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Da sinistra verso destra: &lt;a href="http://www.alessandromostarda.com/" target="_blank"&gt;Alessandro Mostarda&lt;/a&gt; e &lt;a href="http://codetailor.blogspot.com/" target="_blank"&gt;Massimo Bonanni&lt;/a&gt;, Giorgio Di Nardo, &lt;a href="http://blogs.ugidotnet.org/Nick60/Default.aspx" target="_blank"&gt;Nick&lt;/a&gt;, io &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/7226c6221ecf_11545/wlEmoticon-smile_2.png" /&gt;, parte di coloro che hanno avuto la pazienza di ascoltarci &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/7226c6221ecf_11545/wlEmoticon-smile_2.png" /&gt;.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/pietrolibroblog/aggbug/100854.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/pietrolibroblog/archive/2012/03/10/domusdotnet-wewantweb-grazie-a-tutti.aspx</guid>
            <pubDate>Sat, 10 Mar 2012 20:52:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/pietrolibroblog/archive/2012/03/10/domusdotnet-wewantweb-grazie-a-tutti.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/pietrolibroblog/comments/commentRss/100854.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/pietrolibroblog/services/trackbacks/100854.aspx</trackback:ping>
        </item>
        <item>
            <title>EF 4.3 Released</title>
            <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 08:21:00 GMT</pubDate>
            <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 (Prima parte)</title>
            <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>Wed, 21 Dec 2011 01: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>
            <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 08: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>Ed anche&amp;hellip;</title>
            <link>http://blogs.ugidotnet.org/pietrolibroblog/archive/2011/09/07/ed-anchehellip.aspx</link>
            <description>&lt;p&gt;…la 70-516 : Accessing Data with Microsoft .NET Framework 4 è andata. Adesso un paio di settimane di riposo e poi si ricomincia &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/Ed-anche_ABD9/wlEmoticon-smile_2.png" /&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/pietrolibroblog/aggbug/100328.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/pietrolibroblog/archive/2011/09/07/ed-anchehellip.aspx</guid>
            <pubDate>Wed, 07 Sep 2011 13:14:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/pietrolibroblog/archive/2011/09/07/ed-anchehellip.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/pietrolibroblog/comments/commentRss/100328.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/pietrolibroblog/services/trackbacks/100328.aspx</trackback:ping>
        </item>
        <item>
            <title>EF 4.2 Beta 1</title>
            <link>http://blogs.ugidotnet.org/pietrolibroblog/archive/2011/08/22/ef-4.2-beta-1.aspx</link>
            <description>&lt;p&gt;Come preannunciato è disponibile la Beta 1 di Entity Framework, disponibile via NuGet. Maggiori dettagli &lt;a href="http://blogs.msdn.com/b/adonet/archive/2011/08/22/ef-4-2-beta-1-available.aspx" target="_blank"&gt;qui&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/pietrolibroblog/aggbug/100289.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/pietrolibroblog/archive/2011/08/22/ef-4.2-beta-1.aspx</guid>
            <pubDate>Mon, 22 Aug 2011 19:24:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/pietrolibroblog/archive/2011/08/22/ef-4.2-beta-1.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/pietrolibroblog/comments/commentRss/100289.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/pietrolibroblog/services/trackbacks/100289.aspx</trackback:ping>
        </item>
        <item>
            <title>EF 4.1 Release Candidate Available</title>
            <link>http://blogs.ugidotnet.org/pietrolibroblog/archive/2011/03/16/ef-4.1-release-candidate-available.aspx</link>
            <description>&lt;p&gt;Dal blog del team di ADO.NET&lt;/p&gt;  &lt;p&gt;&lt;a title="http://blogs.msdn.com/b/adonet/archive/2011/03/15/ef-4-1-release-candidate-available.aspx" href="http://blogs.msdn.com/b/adonet/archive/2011/03/15/ef-4-1-release-candidate-available.aspx"&gt;http://blogs.msdn.com/b/adonet/archive/2011/03/15/ef-4-1-release-candidate-available.aspx&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/pietrolibroblog/aggbug/99842.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/pietrolibroblog/archive/2011/03/16/ef-4.1-release-candidate-available.aspx</guid>
            <pubDate>Wed, 16 Mar 2011 17:17:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/pietrolibroblog/archive/2011/03/16/ef-4.1-release-candidate-available.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/pietrolibroblog/comments/commentRss/99842.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/pietrolibroblog/services/trackbacks/99842.aspx</trackback:ping>
        </item>
        <item>
            <title>EF 4.1 Is Coming!</title>
            <link>http://blogs.ugidotnet.org/pietrolibroblog/archive/2011/03/03/ef-4.1-is-coming.aspx</link>
            <description>&lt;p&gt;Non condivido alcune scelte come l’eliminazione delle &lt;em&gt;Pluggable Conventions &lt;/em&gt;(erano molto comode)&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Interessante il supporto della validazione anche nella modalità Model First e Database First.&lt;/p&gt;  &lt;p&gt;Tutti i dettagli nell’ultimo post del blog dell’ADO.NET Team: &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/b/adonet/archive/2011/03/02/ef-4-1-is-coming-dbcontext-api-amp-code-first-rtw.aspx"&gt;http://blogs.msdn.com/b/adonet/archive/2011/03/02/ef-4-1-is-coming-dbcontext-api-amp-code-first-rtw.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Vedremo.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/pietrolibroblog/aggbug/99775.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/pietrolibroblog/archive/2011/03/03/ef-4.1-is-coming.aspx</guid>
            <pubDate>Thu, 03 Mar 2011 17:22:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/pietrolibroblog/archive/2011/03/03/ef-4.1-is-coming.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/pietrolibroblog/comments/commentRss/99775.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/pietrolibroblog/services/trackbacks/99775.aspx</trackback:ping>
        </item>
    </channel>
</rss>