<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 6</title>
        <link>http://blogs.ugidotnet.org/pietrolibroblog/category/Entity Framework 6.aspx</link>
        <description>Entity Framework 6</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>EF 6.1 : What&amp;rsquo;s new (3)</title>
            <link>http://blogs.ugidotnet.org/pietrolibroblog/archive/2014/03/27/ef-6.1-whatrsquos-new-3.aspx</link>
            <description>&lt;p&gt;Supporto a “.ToString()” e “String.Concat()”, un esempio:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;var queryConcat = from c &lt;span class="kwrd"&gt;in&lt;/span&gt; db.Vehicles
            &lt;span class="kwrd"&gt;where&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;.Concat(c.EngineSize, c.HP).Equals(&lt;span class="str"&gt;"1600110"&lt;/span&gt;)
            select c;

var queryToString = from c &lt;span class="kwrd"&gt;in&lt;/span&gt; db.Vehicles
            &lt;span class="kwrd"&gt;where&lt;/span&gt;  c.HP.ToString().Equals(&lt;span class="str"&gt;"110"&lt;/span&gt;)
            select c;&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;Abbiamo due Query LINQ che filtrano i dati in base a condizioni su stringhe, la prima “tira fuori” tutti i veicoli dove la concatenazione dei valori delle proprietà “EngineSize” e “HP” è uguale a “1600110”, mentre la seconda esegue un filtro su di un valore intero convertio in stringa. Se proviamo ad eseguire il codice in un ambiente con EF 6.0 otteniamo un’eccezione a runtime in tutti e due i casi:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/EF-6.1--Whats-new-3_7B13/image_2.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/EF-6.1--Whats-new-3_7B13/image_thumb.png" width="244" height="223" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Con EF 6.1 le query sono eseguite correttamente:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/EF-6.1--Whats-new-3_7B13/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/EF-6.1--Whats-new-3_7B13/image_thumb_1.png" width="244" height="165" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cosa succede dietro le quinte:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; 
    [GroupBy1].[A1] &lt;span class="kwrd"&gt;AS&lt;/span&gt; [C1]
    &lt;span class="kwrd"&gt;FROM&lt;/span&gt; ( &lt;span class="kwrd"&gt;SELECT&lt;/span&gt; 
        &lt;span class="kwrd"&gt;COUNT&lt;/span&gt;(1) &lt;span class="kwrd"&gt;AS&lt;/span&gt; [A1]
        &lt;span class="kwrd"&gt;FROM&lt;/span&gt; [DomusDotNet].[Vehicles] &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Extent1]
        &lt;span class="kwrd"&gt;WHERE&lt;/span&gt; N&lt;span class="str"&gt;'1600110'&lt;/span&gt; = (&lt;span class="kwrd"&gt;CASE&lt;/span&gt; &lt;span class="kwrd"&gt;WHEN&lt;/span&gt; ([Extent1].[EngineSize] &lt;span class="kwrd"&gt;IS&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;) &lt;span class="kwrd"&gt;THEN&lt;/span&gt; N&lt;span class="str"&gt;''&lt;/span&gt; &lt;span class="kwrd"&gt;ELSE&lt;/span&gt; [Extent1].[EngineSize] &lt;span class="kwrd"&gt;END&lt;/span&gt; +  &lt;span class="kwrd"&gt;CAST&lt;/span&gt;( [Extent1].[HP] &lt;span class="kwrd"&gt;AS&lt;/span&gt; nvarchar(&lt;span class="kwrd"&gt;max&lt;/span&gt;)))
    )  &lt;span class="kwrd"&gt;AS&lt;/span&gt; [GroupBy1]

&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; 
    [GroupBy1].[A1] &lt;span class="kwrd"&gt;AS&lt;/span&gt; [C1]
    &lt;span class="kwrd"&gt;FROM&lt;/span&gt; ( &lt;span class="kwrd"&gt;SELECT&lt;/span&gt; 
        &lt;span class="kwrd"&gt;COUNT&lt;/span&gt;(1) &lt;span class="kwrd"&gt;AS&lt;/span&gt; [A1]
        &lt;span class="kwrd"&gt;FROM&lt;/span&gt; [DomusDotNet].[Vehicles] &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Extent1]
        &lt;span class="kwrd"&gt;WHERE&lt;/span&gt; N&lt;span class="str"&gt;'110'&lt;/span&gt; =  &lt;span class="kwrd"&gt;CAST&lt;/span&gt;( [Extent1].[HP] &lt;span class="kwrd"&gt;AS&lt;/span&gt; nvarchar(&lt;span class="kwrd"&gt;max&lt;/span&gt;))
    )  &lt;span class="kwrd"&gt;AS&lt;/span&gt; [GroupBy1]&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;Da analizzare il funzionamento di “String.Concat(…)” con SQL Server 2012 per verificare la conversione in SQL con la funzione “nativa SQL” “&lt;a href="http://technet.microsoft.com/en-us/library/hh231515.aspx" target="_blank"&gt;Concat&lt;/a&gt;”.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/pietrolibroblog/aggbug/101829.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/pietrolibroblog/archive/2014/03/27/ef-6.1-whatrsquos-new-3.aspx</guid>
            <pubDate>Thu, 27 Mar 2014 10:04:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/pietrolibroblog/archive/2014/03/27/ef-6.1-whatrsquos-new-3.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/pietrolibroblog/comments/commentRss/101829.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/pietrolibroblog/services/trackbacks/101829.aspx</trackback:ping>
        </item>
        <item>
            <title>EF 6.1 : What&amp;rsquo;s new (2)</title>
            <link>http://blogs.ugidotnet.org/pietrolibroblog/archive/2014/03/20/ef-6.1-whatrsquos-new-2.aspx</link>
            <description>&lt;p&gt;Altra &lt;em&gt;feature &lt;/em&gt;introdotta, l’attributo “IndexAttribute” che ci permette di definire un indice su una o piu’ colonne. Ad esempio, per creare un indice (di nome “IX_FreeDailyKm”) sulla proprietà “FreeDailyKm” del nostro modello, scriviamo:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;[Index(&lt;span class="str"&gt;"IX_FreeDailyKm_Clustered"&lt;/span&gt;, IsUnique = &lt;span class="kwrd"&gt;false&lt;/span&gt;, IsClustered = &lt;span class="kwrd"&gt;false&lt;/span&gt;)]
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; FreeDailyKm { 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;Mentre per creare un indice che insiste su due proprietà, è sufficiente utilizzare lo stesso nome come da esempio:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;[Index(&lt;span class="str"&gt;"IX_Engine"&lt;/span&gt;, 2)]
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; EngineSize { get; set; }

[Index(&lt;span class="str"&gt;"IX_Engine"&lt;/span&gt;, 1)]
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; HP { 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;Utilizzando &lt;em&gt;EF migrations&lt;/em&gt; per aggiornare il database, avremmo:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;CreateIndex(&lt;span class="str"&gt;"DomusDotNet.Vehicles"&lt;/span&gt;, &lt;span class="str"&gt;"FreeDailyKm"&lt;/span&gt;, name: &lt;span class="str"&gt;"IX_FreeDailyKm_Clustered"&lt;/span&gt;);
CreateIndex(&lt;span class="str"&gt;"DomusDotNet.Vehicles"&lt;/span&gt;, &lt;span class="kwrd"&gt;new&lt;/span&gt;[] { &lt;span class="str"&gt;"HP"&lt;/span&gt;, &lt;span class="str"&gt;"EngineSize"&lt;/span&gt; }, name: &lt;span class="str"&gt;"IX_Engine"&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;Quindi, a livello di database:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/EF-6.1--Whats-new-2_EA92/image_2.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/EF-6.1--Whats-new-2_EA92/image_thumb.png" width="244" height="55" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/pietrolibroblog/aggbug/101825.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/pietrolibroblog/archive/2014/03/20/ef-6.1-whatrsquos-new-2.aspx</guid>
            <pubDate>Thu, 20 Mar 2014 17:49:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/pietrolibroblog/archive/2014/03/20/ef-6.1-whatrsquos-new-2.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/pietrolibroblog/comments/commentRss/101825.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/pietrolibroblog/services/trackbacks/101825.aspx</trackback:ping>
        </item>
        <item>
            <title>EF 6.1 : What&amp;rsquo;s new (1)</title>
            <link>http://blogs.ugidotnet.org/pietrolibroblog/archive/2014/03/20/ef-6.1-whatrsquos-new-1.aspx</link>
            <description>&lt;p&gt;Da qualche giorno è stata rilasciata in RTM la &lt;a href="http://blogs.msdn.com/b/adonet/archive/2014/03/17/ef6-1-0-rtm-available.aspx" target="_blank"&gt;versione 6.1.0&lt;/a&gt; di Entity Framework. Una delle novità piu’ interessanti è sicuramente la possibilità di utilizzare l’approcio  &lt;em&gt;Code First &lt;/em&gt;partendo da un database esistente (potrebbe sembrare strano, ma se pensiamo ad un nuovo sviluppo potrebbe non esserlo). I “ferri” da utilizzare sono ovviamente  EF 6.0.1 e la nuova versione di EF Tools, “scaricabile” per VS 2012 e VS 2013 seguendo &lt;a href="http://www.microsoft.com/en-us/download/details.aspx?id=40762" target="_blank"&gt;questo&lt;/a&gt; link.&lt;/p&gt;  &lt;p&gt;Per un semplice test, apriamo VS 2013 (o 2012), magari creando un semplice progetto “Console” al quale aggiungiamo tramite NuGet i riferimenti a EF 6.0.1. Poi tasto destro sul progetto e “Add New Item”, e scegliamo “ADO.NET Entity Data model”:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/EF-6.1--Whats-new-1_9B2C/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/EF-6.1--Whats-new-1_9B2C/image_thumb_1.png" width="244" height="170" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Il testo di “Name” infuenzerà il nome della classe “DbContext” generata. Dalla scheramata successiva (“Entity Data Model Wizard”) scegliamo “Code First model from Database”:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/EF-6.1--Whats-new-1_9B2C/image_6.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/EF-6.1--Whats-new-1_9B2C/image_thumb_2.png" width="244" height="170" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Nella schermata successiva del Wizard verrà chiesta la connessione dati da utilizzare (eventualmente ne creiamo una nuova), nel mio caso, per i test ho utilizzato un DB di un evento “DomusDotNet”. L’ultimo passo è la scelta degli oggetti da “importare”:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/EF-6.1--Whats-new-1_9B2C/image_8.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/EF-6.1--Whats-new-1_9B2C/image_thumb_3.png" width="244" height="219" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Dopo aver premuto “Finish” e qualche secondo di pazienza, VS aggiungerà all’alberatura del progetto, tutte le classi necessarie, una “buildata” per verificare che sia tutto a posto , e qualche riga di codice per verificare l’estrapolazione dati :&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; (CarRental db = &lt;span class="kwrd"&gt;new&lt;/span&gt; CarRental())
{
    System.Console.WriteLine(&lt;span class="str"&gt;"There are {0} cars."&lt;/span&gt;, db.Cars.Count());
    System.Console.ReadKey();
}&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/101823.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/pietrolibroblog/archive/2014/03/20/ef-6.1-whatrsquos-new-1.aspx</guid>
            <pubDate>Thu, 20 Mar 2014 12:42:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/pietrolibroblog/archive/2014/03/20/ef-6.1-whatrsquos-new-1.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/pietrolibroblog/comments/commentRss/101823.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/pietrolibroblog/services/trackbacks/101823.aspx</trackback:ping>
        </item>
        <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>ASP.NET Dynamic Data provider (preview) per EF6</title>
            <link>http://blogs.ugidotnet.org/pietrolibroblog/archive/2014/01/31/asp.net-dynamic-data-provider-preview-per-ef6.aspx</link>
            <description>&lt;p&gt;Rilasciato un aggiornamento per &lt;em&gt;ASP.NET DynamicData&lt;/em&gt; e &lt;em&gt;DataSourceControl&lt;/em&gt; per Entity Framework 6. Tutti i dettagli del caso sul &lt;a href="http://blogs.msdn.com/b/webdev/archive/2014/01/30/announcing-preview-of-dynamic-data-provider-and-entitydatasource-control-for-entity-framework-6.aspx" target="_blank"&gt;blog originale&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/pietrolibroblog/aggbug/101763.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/pietrolibroblog/archive/2014/01/31/asp.net-dynamic-data-provider-preview-per-ef6.aspx</guid>
            <pubDate>Fri, 31 Jan 2014 10:23:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/pietrolibroblog/archive/2014/01/31/asp.net-dynamic-data-provider-preview-per-ef6.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/pietrolibroblog/comments/commentRss/101763.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/pietrolibroblog/services/trackbacks/101763.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>EF6 RTM Available</title>
            <link>http://blogs.ugidotnet.org/pietrolibroblog/archive/2013/10/17/ef6-rtm-available.aspx</link>
            <description>&lt;p&gt;Con il rilascio di VS 2013, puntuale anche il rilascio in RTM di Entity Framework 6, tutti i dettagli direttamente sul blog di &lt;a href="http://blogs.msdn.com/b/adonet/archive/2013/10/17/ef6-rtm-available.aspx#!" target="_blank"&gt;ADO.NET&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/pietrolibroblog/aggbug/101699.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/pietrolibroblog/archive/2013/10/17/ef6-rtm-available.aspx</guid>
            <pubDate>Thu, 17 Oct 2013 16:25:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/pietrolibroblog/archive/2013/10/17/ef6-rtm-available.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/pietrolibroblog/comments/commentRss/101699.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/pietrolibroblog/services/trackbacks/101699.aspx</trackback:ping>
        </item>
        <item>
            <title>EF 6 : Logging &amp;amp; Interception</title>
            <link>http://blogs.ugidotnet.org/pietrolibroblog/archive/2013/09/04/ef-6-logging-amp-interception.aspx</link>
            <description>&lt;p&gt; &lt;/p&gt;  &lt;p&gt;Una delle nuove feature introdotte nella versione 6 di Entity Framework (attualmente in RC) è il supporto al &lt;em&gt;logging&lt;/em&gt; dell’SQL generato dal runtime di EF6. A tal fine è sufficiente passare un opportuno &lt;em&gt;delegate&lt;/em&gt; alla proporietà &lt;em&gt;Log&lt;/em&gt; esposta da &lt;em&gt;DbContext.Database&lt;/em&gt;. Per gli esempi riprendiamo lo scenario del &lt;a href="http://blogs.ugidotnet.org/PietroLibroBlog/archive/2013/08/19/ef6-beta-multiple-contexts-per-database-multi-tenant-migrations.aspx" target="_blank"&gt;post precedente&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;Supponiamo di avere il seguente codice:&lt;/p&gt;  &lt;pre class="csharpcode"&gt; &lt;span class="kwrd"&gt;using&lt;/span&gt; (CarContext db = &lt;span class="kwrd"&gt;new&lt;/span&gt; CarContext())
{
 
    System.Console.WriteLine(&lt;span class="str"&gt;"Cars in database : {0}"&lt;/span&gt;, db.Cars.Count());

    &lt;span class="rem"&gt;////Add a new car.&lt;/span&gt;
    Car car = &lt;span class="kwrd"&gt;new&lt;/span&gt; Car()
    {
        Brand = &lt;span class="str"&gt;"Alfa Romeo"&lt;/span&gt;,
        Model = &lt;span class="str"&gt;"Giulietta"&lt;/span&gt;
    };

    db.Cars.Add(car);
    db.SaveChanges();

    System.Console.WriteLine(&lt;span class="str"&gt;"Cars in database : {0}"&lt;/span&gt;, db.Cars.Count());               
}&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;

&lt;p&gt;Che banalmente visualizza il numero di auto (Cars) presenti nel  &lt;em&gt;repository&lt;/em&gt;, ne aggiunge una e riesegue la conta delle auto registrate. Se volessimo analizzare l’SQL generato un ottimo strumento è sicuramete il SQL Profiler di SQL Server (che non dovrebbe mai mancare quando si lavora con un ORM &lt;img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none" alt="Smile" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/EF-6--Logging--Interceptor_6F20/wlEmoticon-smile_2.png" /&gt; ), ma se utilizziamo EF6, ed il nostro obiettivo è semplicemente “scoprire\loggare” l’SQL generato da EF, possiamo modificare il codice precedente aggiungendo dopo la definizione del &lt;em&gt;DbContext,&lt;/em&gt; la riga seguente:&lt;/p&gt;

&lt;pre class="csharpcode"&gt; db.Database.Log = Console.Write;&lt;/pre&gt;

&lt;pre class="csharpcode"&gt; &lt;/pre&gt;

&lt;p&gt;Dove la proprietà &lt;em&gt;Log&lt;/em&gt; è cosi’ definita:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; Action&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; Log { get; set; }&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;Eseguendo il codice della nostra applicazione dovremmo ottenere una “Console” simile alla seguente:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/EF-6--Logging--Interceptor_6F20/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/EF-6--Logging--Interceptor_6F20/image_thumb.png" width="244" height="172" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Di default il log è molto chiaro in quanto ci restituisce il testo SQL del comando, quando è stato eseguito, il tempo impiegato, il tipo di risultato, gli eventuali parametri ed il tipo corrispondente. Possiamo ovviamente cambiare il contenuto e la formattazione del log secondo le nostre esigenze (e non solo) come vedremo piu’ avanti. Per come è definita la proprietà &lt;em&gt;Log&lt;/em&gt;, qualsiasi funzione che accetta una stringa puo’ essere utilizzata per scrivere il nostro log. Quindi potremmo utilizzare un metodo tipo il seguente:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Log(&lt;span class="kwrd"&gt;string&lt;/span&gt; sql)
{
    Console.WriteLine(&lt;span class="str"&gt;"------------------------------------"&lt;/span&gt;);
    Console.WriteLine(&lt;span class="str"&gt;"SQL LOG: {0} "&lt;/span&gt;, sql);
    Console.WriteLine(&lt;span class="str"&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; &lt;/p&gt;

&lt;p&gt;oppure:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;System.IO.StreamWriter streamWriter = &lt;span class="kwrd"&gt;new&lt;/span&gt; System.IO.StreamWriter (fileStream, System.Text.ASCIIEncoding.ASCII );
db.Database.Log = sql =&amp;gt; streamWriter.Write(sql);&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 scrivere il log direttamente su file. Il concetto dovrebbe essere abbastanza chiaro. Vediamo come personalizzare la formattazione del log. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Database.Log&lt;/em&gt; non fa altro che utilizzare un ogetto &lt;em&gt;DatabaseLogFormatter &lt;/em&gt;che a sua volta implementa le interfacce &lt;em&gt;IDbCommandInterceptor&lt;/em&gt; e &lt;em&gt;IDbInterceptor &lt;/em&gt;che sono rispettivamente l’interfaccia che permette di registrare un oggetto che possa ricevere notifiche da parte di Entity Framework quando un comando viene eseguito e l’interfaccia base per tutte le interfacce che permettono di fornire un &lt;em&gt;Interception Point&lt;/em&gt; per differenti tipi di operazione.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/EF-6--Logging--Interceptor_6F20/image_4.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/EF-6--Logging--Interceptor_6F20/image_thumb_1.png" width="134" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quindi, per creare il nostro “Formattatore Custom” non ci resta che ereditare dalla classe &lt;em&gt;DatabaseLogFormatter&lt;/em&gt; ed eseguire &lt;em&gt;l’override&lt;/em&gt; dei metodi che ci interessano, come nel caso seguente:&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; CustomLogFormatter
    : DatabaseLogFormatter
{
    &lt;span class="kwrd"&gt;public&lt;/span&gt; CustomLogFormatter(DbContext context, Action&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; writeAction)
        : &lt;span class="kwrd"&gt;base&lt;/span&gt;(context, writeAction)
    {
    }

    &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; LogCommand&amp;lt;TResult&amp;gt;(
        DbCommand command, DbCommandInterceptionContext&amp;lt;TResult&amp;gt; interceptionContext)
    {
        Write(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;"{0}{1}"&lt;/span&gt;, &lt;span class="str"&gt;"==============================================="&lt;/span&gt;, Environment.NewLine));

        Write(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(
            &lt;span class="str"&gt;"Context{2}{0}{2}Command{2}{1}{2}"&lt;/span&gt;,
            Context.GetType().Name,
            command.CommandText.Replace(Environment.NewLine, &lt;span class="str"&gt;""&lt;/span&gt;),
            Environment.NewLine));

        Write(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;"{0}{1}"&lt;/span&gt;, &lt;span class="str"&gt;"==============================================="&lt;/span&gt;, Environment.NewLine));            
    }
}&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;Dove, l’&lt;em&gt;override&lt;/em&gt; del metodo &lt;em&gt;LogCommand &lt;/em&gt;esegue la formattazione del comando prima che questo sia eseguito da Entity Framework&lt;em&gt;. LogCommand&lt;/em&gt; a sua volta  chiama eventualmente il metodo &lt;em&gt;LogParameter&lt;/em&gt; per ogni parametro del comando, è necessario eseguire l’override di &lt;em&gt;LogParameter &lt;/em&gt;per “customizzare” la formattazione del log dei paramateri. Infine, se vogliamo cambiare la formattazione del risultato, è necessario effettuare l’override di &lt;em&gt;LogResult. &lt;/em&gt;Per interrompere l’esecuzione del comando, possiamo utilizzare il metodo :&lt;/p&gt;

&lt;pre class="csharpcode"&gt;interceptionContext.SuppressExecution()&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;Nel corpo dell’&lt;em&gt;override&lt;/em&gt; di &lt;em&gt;LogCommand. &lt;/em&gt;Per vedere in “funzione” il nostro “Formatter” è sufficiente registrare l’istanza di &lt;em&gt;CustomLogFormatter&lt;/em&gt; tramite una classe derivata da &lt;em&gt;DbConfiguration&lt;/em&gt; presente nello stesso assembly che contiene la definizione del &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; MyDbConfiguration : DbConfiguration
{
    &lt;span class="kwrd"&gt;public&lt;/span&gt; MyDbConfiguration()
    {
        SetDatabaseLogFormatter(
            (context, writeAction) =&amp;gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; CustomLogFormatter(context, writeAction));
    }
}&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;Eseguendo, otteniamo il “nostro” log:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/EF-6--Logging--Interceptor_6F20/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/EF-6--Logging--Interceptor_6F20/image_thumb_2.png" width="244" height="118" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Per approfondimenti:&lt;/p&gt;

&lt;p&gt;&lt;a title="https://entityframework.codeplex.com/wikipage?title=Interception" href="https://entityframework.codeplex.com/wikipage?title=Interception" target="_blank"&gt;Entity Framework Codeplex&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.oneunicorn.com/2013/05/08/ef6-sql-logging-part-1-simple-logging/" target="_blank"&gt;One Unicorn: EF6 SQL Logging&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/pietrolibroblog/aggbug/101658.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/pietrolibroblog/archive/2013/09/04/ef-6-logging-amp-interception.aspx</guid>
            <pubDate>Wed, 04 Sep 2013 15:15:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/pietrolibroblog/archive/2013/09/04/ef-6-logging-amp-interception.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/pietrolibroblog/comments/commentRss/101658.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/pietrolibroblog/services/trackbacks/101658.aspx</trackback:ping>
        </item>
        <item>
            <title>Disponibile EF 6 RC</title>
            <link>http://blogs.ugidotnet.org/pietrolibroblog/archive/2013/08/22/disponibile-ef-6-rc.aspx</link>
            <description>&lt;p&gt;Rilasciata la RC di Entity Framework 6, tutti i dettagli e le novità rispetto alla Beta 1, &lt;a href="http://blogs.msdn.com/b/adonet/archive/2013/08/21/ef6-release-candidate-available.aspx" target="_blank"&gt;qui&lt;/a&gt;. &lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/pietrolibroblog/aggbug/101644.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/pietrolibroblog/archive/2013/08/22/disponibile-ef-6-rc.aspx</guid>
            <pubDate>Thu, 22 Aug 2013 09:25:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/pietrolibroblog/archive/2013/08/22/disponibile-ef-6-rc.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/pietrolibroblog/comments/commentRss/101644.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/pietrolibroblog/services/trackbacks/101644.aspx</trackback:ping>
        </item>
        <item>
            <title>EF6 (beta) : Multiple Contexts per Database, Multi-Tenant Migrations</title>
            <link>http://blogs.ugidotnet.org/pietrolibroblog/archive/2013/08/19/ef6-beta-multiple-contexts-per-database-multi-tenant-migrations.aspx</link>
            <description>&lt;p&gt;Una delle novità introdotte con EF6 è la possibilità di gestire molteplici modelli per singola istanza di database, che non vuol dire usare lo stesso contesto piu’ volte nello stesso database, ma poter utilizzare Entity Framework Migrations e relativa Migration History Table per gestire la migrazione di due o piu’ modelli per singolo database fisico. Specifichiamo questa &lt;em&gt;feature&lt;/em&gt; come &lt;em&gt;Multi-Tenant Migrations&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;Come esempio, supponiamo di avere due classi &lt;em&gt;Bus&lt;/em&gt; e &lt;em&gt;Car&lt;/em&gt; facenti parte dello stesso &lt;em&gt;Domain&lt;/em&gt; di una nostra applicazione, ma interessate da due &lt;em&gt;DbContext &lt;/em&gt;diversi, rispettivamente &lt;em&gt;BusContext&lt;/em&gt; e &lt;em&gt;CarContext&lt;/em&gt;, come da &lt;em&gt;Class 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/8d783d8054a5_11B93/image_16.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/8d783d8054a5_11B93/image_thumb.png" width="244" height="62" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Provando ad abilitare EF Migrations per il progetto corrente, essendo presenti due &lt;em&gt;DbContext&lt;/em&gt;, il “Package Manager Console” risponderebbe restituendo l’errore seguente:&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/8d783d8054a5_11B93/image_4.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; display: block; padding-right: 0px; border-top-width: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/8d783d8054a5_11B93/image_thumb_1.png" width="244" height="72" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Vediamo come utilizzare &lt;em&gt;Multi-Tenant Migrations&lt;/em&gt;: iniziamo ad utilizzare la prima delle novità di EF6 (migrations), l’opzione “-MigrationDirectory” che ci permette di specificare, insieme all’opzione “-ContextTypeName” che rispettivamente indicano dove far risiedere i piani di migrazione e quale &lt;em&gt;DbContext&lt;/em&gt; considerare. Il comando completo da utilizzare diventa quindi:&lt;/p&gt; &lt;p&gt;&lt;em&gt;PM&amp;gt;Enable-Migrations -MigrationsDirectory BusDbContextMigration -ContextTypeName MultiTenantMigration.BusContext&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Questa volta tutto fila liscio, ottenendo un messaggio di questo tipo:&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/8d783d8054a5_11B93/image_6.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; display: block; padding-right: 0px; border-top-width: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/8d783d8054a5_11B93/image_thumb_2.png" width="244" height="39" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Il “Solution Explorer” dovrebbe apparire simile alla figura seguente:&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/8d783d8054a5_11B93/image_8.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; display: block; padding-right: 0px; border-top-width: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/8d783d8054a5_11B93/image_thumb_3.png" width="244" height="175" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Visualizziamo il codice della classe &lt;em&gt;Configuration.cs&lt;/em&gt; e modifichiamolo opportunatamente impostando la proprietà &lt;em&gt;ContextKey&lt;/em&gt; che altro non è una nuova proprietà di configurazione per EF6 Migrations che aggiunge nella “_MigrationHistory Table” una nuova colonna che rende possibile la funzionalità “Multi-Tenant”:&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; Configuration()
{
    ContextKey = &lt;span class="str"&gt;"BusContextKey"&lt;/span&gt;;
    AutomaticMigrationsEnabled = &lt;span class="kwrd"&gt;false&lt;/span&gt;;            
    MigrationsDirectory = &lt;span class="str"&gt;@"BusDbContextMigration"&lt;/span&gt;;
}&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;Come prima, eseguiamo le operazioni precedenti per abilitare la migrazione anche per il &lt;em&gt;DbContext &lt;/em&gt;“CarContext” ottenendo un “Solution Explorer” simile al seguente:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/8d783d8054a5_11B93/image_10.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; display: block; padding-right: 0px; border-top-width: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/8d783d8054a5_11B93/image_thumb_4.png" width="244" height="160" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;E per &lt;em&gt;Configuration.cs&lt;/em&gt;:&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; Configuration()
{
    ContextKey = &lt;span class="str"&gt;"CarContext"&lt;/span&gt;;
    AutomaticMigrationsEnabled = &lt;span class="kwrd"&gt;false&lt;/span&gt;;            
    MigrationsDirectory = &lt;span class="str"&gt;@"CarDbContextMigration"&lt;/span&gt;;
}&lt;/pre&gt;&lt;pre class="csharpcode"&gt; &lt;/pre&gt;
&lt;p&gt;Aggiungiamo i corrispettivi piani di migrazione:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;PM&amp;gt; Add-Migration CarDbMigration -ConfigurationTypeName MultiTenantMigration.CarDbContextMigration.Configuration &lt;br /&gt;Scaffolding migration 'CarDbMigration'&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;PM&amp;gt; Add-Migration BusDbMigration -ConfigurationTypeName MultiTenantMigration.BusDbContextMigration.Configuration &lt;br /&gt;Scaffolding migration 'BusDbMigration'&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Procediamo con l’aggiornamento del database (ricordiamo essere lo stesso per i due &lt;em&gt;DbContext&lt;/em&gt;). Procediamo con &lt;em&gt;CarDbContext&lt;/em&gt;:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;PM&amp;gt; Update-Database -ConfigurationTypeName MultiTenantMigration.CarDbContextMigration.Configuration &lt;br /&gt;Specify the '-Verbose' flag to view the SQL statements being applied to the target database. &lt;br /&gt;Applying explicit migrations: [201308141834283_CarDbMigration]. &lt;br /&gt;Applying explicit migration: 201308141834283_CarDbMigration. &lt;br /&gt;Running Seed method.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Il messaggio indica che l’aggiornamento è stato completato con successo. Passiamo ora a &lt;em&gt;BusDbContext&lt;/em&gt;:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;PM&amp;gt; Update-Database -ConfigurationTypeName MultiTenantMigration.BusDbContextMigration.Configuration &lt;br /&gt;Specify the '-Verbose' flag to view the SQL statements being applied to the target database. &lt;br /&gt;Applying explicit migrations: [201308141835410_BusDbMigration]. &lt;br /&gt;Applying explicit migration: 201308141835410_BusDbMigration.&lt;br /&gt;Running Seed method.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A livello database:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/8d783d8054a5_11B93/image_12.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; display: block; padding-right: 0px; border-top-width: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/8d783d8054a5_11B93/image_thumb_5.png" width="244" height="114" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In dettaglio, la tabella “MigrationHistory” è popolata con le seguenti righe (da notare la colonna &lt;em&gt;ContextKey&lt;/em&gt;):&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/8d783d8054a5_11B93/image_14.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; display: block; padding-right: 0px; border-top-width: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/8d783d8054a5_11B93/image_thumb_6.png" width="244" height="37" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A questo punto, tutte le successive modifiche al modello, ed i relativi piani di migrazione dovrebbero essere applicati con successo.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/pietrolibroblog/aggbug/101641.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/pietrolibroblog/archive/2013/08/19/ef6-beta-multiple-contexts-per-database-multi-tenant-migrations.aspx</guid>
            <pubDate>Mon, 19 Aug 2013 09:38:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/pietrolibroblog/archive/2013/08/19/ef6-beta-multiple-contexts-per-database-multi-tenant-migrations.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/pietrolibroblog/comments/commentRss/101641.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/pietrolibroblog/services/trackbacks/101641.aspx</trackback:ping>
        </item>
    </channel>
</rss>