<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>Code First Migrations</title>
        <link>http://blogs.ugidotnet.org/pietrolibroblog/category/Code First Migrations.aspx</link>
        <description>Code First Migrations</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>Dynamic Data Provider per EF6 released</title>
            <link>http://blogs.ugidotnet.org/pietrolibroblog/archive/2014/03/03/dynamic-data-provider-per-ef6-released.aspx</link>
            <description>&lt;p&gt;Sono stati rilasciati in RTM, &lt;em&gt;ASP.NET Dynamic Data&lt;/em&gt; e &lt;em&gt;EntityDataSource&lt;/em&gt; per EntityFrameowrk 6. Per provare la nuova versione di &lt;em&gt;Dynamic Data&lt;/em&gt; è sufficiente creare un nuovo progetto di tipo “ASP.NET Dynamic Data Entities Web Application”, ed installare tramite NuGet il package &lt;em&gt;Microsoft.AspNet.DynamicData.EFProvider&lt;/em&gt;:&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/3b52774302cc_7140/image_2.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/3b52774302cc_7140/image_thumb.png" width="244" height="33" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Eventualmente forziamo la scrittura dei &lt;em&gt;Template&lt;/em&gt; (“A” per sovrascrivere tutto):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/3b52774302cc_7140/image_4.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; border-left: 0px; display: block; padding-right: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/3b52774302cc_7140/image_thumb_1.png" width="244" height="39" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Aggiungiamo in modalità &lt;em&gt;Code First&lt;/em&gt; una semplice classe &lt;em&gt;Book &lt;/em&gt;e relativo &lt;em&gt;DbContext&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; Book
{
    &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; &lt;span class="kwrd"&gt;string&lt;/span&gt; Title { get; set; }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Authors { get; set; }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Pages { get; set; }
}

&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Db : DbContext
{
    &lt;span class="kwrd"&gt;public&lt;/span&gt; DbSet&amp;lt;Book&amp;gt; Books { 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;/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; &lt;/p&gt;

&lt;p&gt;Nel &lt;em&gt;Global.asax&lt;/em&gt; registriamo il nostro &lt;em&gt;DbContext&lt;/em&gt;:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;DefaultModel.RegisterContext(
            &lt;span class="kwrd"&gt;new&lt;/span&gt; Microsoft.AspNet.DynamicData.ModelProviders.EFDataModelProvider(() =&amp;gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; Db()),
            &lt;span class="kwrd"&gt;new&lt;/span&gt; ContextConfiguration { ScaffoldAllTables = &lt;span class="kwrd"&gt;true&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; &lt;/p&gt;

&lt;p&gt;F5, per vedere in azione il nostro &lt;em&gt;Data Site&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/3b52774302cc_7140/image_6.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/3b52774302cc_7140/image_thumb_2.png" width="244" height="156" /&gt;&lt;/a&gt;&lt;/p&gt;





&lt;p&gt;Discorso simile per l’utilizzo &lt;em&gt;dell’EntityDataSource&lt;/em&gt; control.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/pietrolibroblog/aggbug/101806.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/pietrolibroblog/archive/2014/03/03/dynamic-data-provider-per-ef6-released.aspx</guid>
            <pubDate>Mon, 03 Mar 2014 10:06:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/pietrolibroblog/archive/2014/03/03/dynamic-data-provider-per-ef6-released.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/pietrolibroblog/comments/commentRss/101806.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/pietrolibroblog/services/trackbacks/101806.aspx</trackback:ping>
        </item>
        <item>
            <title>EF : Relazione one-to-many Table-View</title>
            <link>http://blogs.ugidotnet.org/pietrolibroblog/archive/2013/12/19/ef-relazione-one-to-many-table-view.aspx</link>
            <description>&lt;p&gt;Immaginiamo di avere un database SQL Server esistente, e vogliamo utilizzare Entity Framework Code First per mappare il modello dati. &lt;/p&gt;  &lt;p&gt;Supponendo di avere due tabelle “Items” e “Categories” in relazione come da &lt;em&gt;Database Diagram&lt;/em&gt; seguente:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/a8bf8935c20d_D16A/image_2.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/a8bf8935c20d_D16A/image_thumb.png" width="244" height="94" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ed una “Vista” SQL Server definita come segue:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;CREATE&lt;/span&gt; &lt;span class="kwrd"&gt;VIEW&lt;/span&gt; [dbo].[VCategories]
&lt;span class="kwrd"&gt;AS&lt;/span&gt;
&lt;span class="kwrd"&gt;SELECT&lt;/span&gt;    Id, Name
&lt;span class="kwrd"&gt;FROM&lt;/span&gt;      Categories
&lt;span class="kwrd"&gt;WHERE&lt;/span&gt;     (Deleted = 0)&lt;/pre&gt;

&lt;pre class="csharpcode"&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;Aggiungiamo due classi C# definite in questo modo:&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; Category
{
    &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; &lt;span class="kwrd"&gt;string&lt;/span&gt; Description { get; set; }
}&lt;/pre&gt;

&lt;p&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; Item
{
    &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; &lt;span class="kwrd"&gt;string&lt;/span&gt; Code { get; set; }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Description { get; set; }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; CategoryId { get; set; }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; Category Category { 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; &lt;/p&gt;

&lt;p&gt;che mappiamo tramite &lt;em&gt;OnModelCreating (&lt;/em&gt;nella classe derivata da &lt;em&gt;DbContext) &lt;/em&gt;come segue :&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;Category&amp;gt;().ToTable(&lt;span class="str"&gt;"VCategories"&lt;/span&gt;)
        .Property(c =&amp;gt; c.Description).HasColumnName(&lt;span class="str"&gt;"Name"&lt;/span&gt;);

    modelBuilder.Entity&amp;lt;Item&amp;gt;().ToTable(&lt;span class="str"&gt;"Items"&lt;/span&gt;);
    modelBuilder.Entity&amp;lt;Item&amp;gt;().HasRequired(x =&amp;gt; x.Category)
        .WithMany().HasForeignKey(o =&amp;gt; o.CategoryId);
}&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; &lt;/p&gt;

&lt;p&gt;Per verificare il funzionamento del &lt;em&gt;mapping&lt;/em&gt; possiamo scrivere del codice tipo:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;Item item = &lt;span class="kwrd"&gt;null&lt;/span&gt;;

&lt;span class="kwrd"&gt;using&lt;/span&gt; (Db db = &lt;span class="kwrd"&gt;new&lt;/span&gt; Db())
{
    Console.WriteLine(&lt;span class="str"&gt;"Items count : {0}"&lt;/span&gt;, db.Items.Count());

    Category category = (from c &lt;span class="kwrd"&gt;in&lt;/span&gt; db.Categories &lt;span class="kwrd"&gt;where&lt;/span&gt; c.Id == 1 select c)
        .FirstOrDefault();

    item = &lt;span class="kwrd"&gt;new&lt;/span&gt; Item()
    {
        Category = category,
        CategoryId = category.Id,
        Code = &lt;span class="str"&gt;"Code #1"&lt;/span&gt;,
        Description = &lt;span class="str"&gt;"Description #1"&lt;/span&gt;,
    };

    db.Items.Add(item);
    db.SaveChanges();

    Console.WriteLine(&lt;span class="str"&gt;"Items count : {0}"&lt;/span&gt;, db.Items.Count());
}

&lt;span class="kwrd"&gt;using&lt;/span&gt; (Db db = &lt;span class="kwrd"&gt;new&lt;/span&gt; Db())
{
    &lt;span class="rem"&gt;////Edit&lt;/span&gt;
    item.Description = &lt;span class="str"&gt;"New Description #1."&lt;/span&gt;;

    db.Entry&amp;lt;Item&amp;gt;(item).State = System.Data.Entity.EntityState.Modified;                
    db.SaveChanges();

    Console.WriteLine(&lt;span class="str"&gt;"Items count : {0}"&lt;/span&gt;, db.Items.Count());
}

&lt;span class="kwrd"&gt;using&lt;/span&gt; (Db db = &lt;span class="kwrd"&gt;new&lt;/span&gt; Db())
{
    &lt;span class="rem"&gt;////Delete.               &lt;/span&gt;
    db.Entry&amp;lt;Item&amp;gt;(item).State = System.Data.Entity.EntityState.Deleted;
    db.SaveChanges();

    Console.WriteLine(&lt;span class="str"&gt;"Items count : {0}"&lt;/span&gt;, db.Items.Count());
}&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/101747.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/pietrolibroblog/archive/2013/12/19/ef-relazione-one-to-many-table-view.aspx</guid>
            <pubDate>Thu, 19 Dec 2013 16:55:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/pietrolibroblog/archive/2013/12/19/ef-relazione-one-to-many-table-view.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/pietrolibroblog/comments/commentRss/101747.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/pietrolibroblog/services/trackbacks/101747.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>EF Code First Migrations Beta 1 (Parte 1)</title>
            <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 23: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>
            <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 12:52:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/pietrolibroblog/archive/2011/11/30/code-first-migrations-beta-1-released.aspx#feedback</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>
    </channel>
</rss>