ASP.NET 5 http://blogs.ugidotnet.org/PietroLibroBlog/category/ASP.NET 5.aspx ASP.NET 5 it-IT Pietro Libro pietro.libro@libero.it Subtext Version 2.6.0.0 ASP.NET 5 e AzureTableStorage http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/11/30/asp.net-5-e-azuretablestorage.aspx <p>Riprendiamo l’esempio del post <a href="http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/11/30/asp.net-5-e-entity-framework-7-beta.aspx" target="_blank">precedente</a> per testare l’integrazione tra EF7 e lo storage di Azure. Apriamo NuGet ed installiamo il package “EntityFramework.AzureTableStorage” (sempre in beta):</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/ASP.NET-5-e-AzureTableStorage_12A85/image_2.png"><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/ASP.NET-5-e-AzureTableStorage_12A85/image_thumb.png" width="244" height="65" /></a></p> <p>Modifichiamo il codice della classe <em>ItemDB</em> in questo modo:</p> <p> </p><div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:68787369-7880-4ef3-a7a0-14d1d7b508da" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"><pre style=" width: 754px; height: 279px;background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #008080;"> 1</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">class</span><span style="color: #000000;"> ItemDB : DbContext </span><span style="color: #008080;"> 2</span> <span style="color: #000000;"> { </span><span style="color: #008080;"> 3</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> DbSet</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Item</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> Items { </span><span style="color: #0000FF;">get</span><span style="color: #000000;">; </span><span style="color: #0000FF;">set</span><span style="color: #000000;">; } </span><span style="color: #008080;"> 4</span> <span style="color: #000000;"> </span><span style="color: #008080;"> 5</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">protected</span><span style="color: #000000;"> </span><span style="color: #0000FF;">override</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> OnConfiguring(DbContextOptions options) </span><span style="color: #008080;"> 6</span> <span style="color: #000000;"> { </span><span style="color: #008080;"> 7</span> <span style="color: #000000;"> options.UseAzureTableStorage(</span><span style="color: #800000;">"</span><span style="color: #800000;">[Storage_Name]</span><span style="color: #800000;">"</span><span style="color: #000000;">, </span><span style="color: #800000;">"</span><span style="color: #800000;">[Secret_Key</span><span style="color: #800000;">"</span><span style="color: #000000;">); </span><span style="color: #008080;"> 8</span> <span style="color: #000000;"> } </span><span style="color: #008080;"> 9</span> <span style="color: #000000;"> </span><span style="color: #008080;">10</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">protected</span><span style="color: #000000;"> </span><span style="color: #0000FF;">override</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> OnModelCreating(ModelBuilder modelBuilder) </span><span style="color: #008080;">11</span> <span style="color: #000000;"> { </span><span style="color: #008080;">12</span> <span style="color: #000000;"> modelBuilder.Entity</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Item</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">().ForAzureTableStorage() </span><span style="color: #008080;">13</span> <span style="color: #000000;"> .PartitionAndRowKey(a </span><span style="color: #000000;">=&gt;</span><span style="color: #000000;"> a.CategoryId, a </span><span style="color: #000000;">=&gt;</span><span style="color: #000000;"> a.Id) </span><span style="color: #008080;">14</span> <span style="color: #000000;"> .Table(</span><span style="color: #800000;">"</span><span style="color: #800000;">Items</span><span style="color: #800000;">"</span><span style="color: #000000;">); </span><span style="color: #008080;">15</span> <span style="color: #000000;"> } </span><span style="color: #008080;">16</span> <span style="color: #000000;"> }</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>Rispetto all’esempio precedente è stato rimosso il metodo di estensione <em>UseSqlServer</em> ed aggiunto un degli overload di <em>UseAzureTableStorage </em>che accetta in ingresso due parametri: <em>accountName</em> ed <em>accountKey</em>. Tramite l’override di <em>OnModelCreating</em> andiamo ad istruire il runtime sulle propietà della classe <em>Item</em> che rappresentato rispettivamente la <em>PartitionKey</em> e la <em>RowKey</em> del <em>Table Storage</em> su Azure. Modifichiamo il file <em>Project.json</em> commentando la voce <em>aspnetcore50</em> nella sezione frameworks:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/ASP.NET-5-e-AzureTableStorage_12A85/image_6.png"><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/ASP.NET-5-e-AzureTableStorage_12A85/image_thumb_2.png" width="244" height="136" /></a></p> <p>La classe <em>Item</em> modificata è la seguente:</p> <div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:670be0b5-84a3-4f04-9dc1-58a7b1edaad9" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"><pre style=" width: 503px; height: 133px;background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #008080;">1</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">class</span><span style="color: #000000;"> Item </span><span style="color: #008080;">2</span> <span style="color: #000000;"> { </span><span style="color: #008080;">3</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">int</span><span style="color: #000000;"> Id { </span><span style="color: #0000FF;">get</span><span style="color: #000000;">; </span><span style="color: #0000FF;">set</span><span style="color: #000000;">; } </span><span style="color: #008080;">4</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">int</span><span style="color: #000000;"> CategoryId { </span><span style="color: #0000FF;">get</span><span style="color: #000000;">; </span><span style="color: #0000FF;">set</span><span style="color: #000000;">; } </span><span style="color: #008080;">5</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> Code { </span><span style="color: #0000FF;">get</span><span style="color: #000000;">; </span><span style="color: #0000FF;">set</span><span style="color: #000000;">; } </span><span style="color: #008080;">6</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> Description { </span><span style="color: #0000FF;">get</span><span style="color: #000000;">; </span><span style="color: #0000FF;">set</span><span style="color: #000000;">; } </span><span style="color: #008080;">7</span> <span style="color: #000000;"> }</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>Infine modifichiamo la classe <em>Program.cs</em>:</p> <p> </p><div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:39117039-548a-45de-ae40-9252b10f3597" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"><pre style=" width: 810px; height: 470px;background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #008080;"> 1</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> Main(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">[] args) </span><span style="color: #008080;"> 2</span> <span style="color: #000000;"> { </span><span style="color: #008080;"> 3</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">using</span><span style="color: #000000;"> (ItemDB db </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> ItemDB()) </span><span style="color: #008080;"> 4</span> <span style="color: #000000;"> { </span><span style="color: #008080;"> 5</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">int</span><span style="color: #000000;"> nextId </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Random().Next(</span><span style="color: #800080;">100000</span><span style="color: #000000;">); </span><span style="color: #008080;"> 6</span> <span style="color: #000000;"> </span><span style="color: #008080;"> 7</span> <span style="color: #000000;"> db.Items.Add(</span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Item() </span><span style="color: #008080;"> 8</span> <span style="color: #000000;"> { </span><span style="color: #008080;"> 9</span> <span style="color: #000000;"> Id </span><span style="color: #000000;">=</span><span style="color: #000000;"> nextId, </span><span style="color: #008080;">10</span> <span style="color: #000000;"> Code </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Item #</span><span style="color: #800000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> nextId, </span><span style="color: #008080;">11</span> <span style="color: #000000;"> Description </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Description #</span><span style="color: #800000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> nextId </span><span style="color: #008080;">12</span> <span style="color: #000000;"> }); </span><span style="color: #008080;">13</span> <span style="color: #000000;"> </span><span style="color: #008080;">14</span> <span style="color: #000000;"> db.SaveChanges(); </span><span style="color: #008080;">15</span> <span style="color: #000000;"> } </span><span style="color: #008080;">16</span> <span style="color: #000000;"> </span><span style="color: #008080;">17</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">using</span><span style="color: #000000;"> (ItemDB db </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> ItemDB()) </span><span style="color: #008080;">18</span> <span style="color: #000000;"> { </span><span style="color: #008080;">19</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">foreach</span><span style="color: #000000;"> (Item item </span><span style="color: #0000FF;">in</span><span style="color: #000000;"> db.Items) </span><span style="color: #008080;">20</span> <span style="color: #000000;"> { </span><span style="color: #008080;">21</span> <span style="color: #000000;"> Console.WriteLine(</span><span style="color: #800000;">"</span><span style="color: #800000;">Item Id: {0}, Code: {1}, Description : {2}</span><span style="color: #800000;">"</span><span style="color: #000000;">, </span><span style="color: #008080;">22</span> <span style="color: #000000;"> item.Id, item.Code, item.Description); </span><span style="color: #008080;">23</span> <span style="color: #000000;"> } </span><span style="color: #008080;">24</span> <span style="color: #000000;"> } </span><span style="color: #008080;">25</span> <span style="color: #000000;"> </span><span style="color: #008080;">26</span> <span style="color: #000000;"> Console.ReadLine(); </span><span style="color: #008080;">27</span> <span style="color: #000000;"> }</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>Proviamo quindi ad eseguire l’applicazione:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/ASP.NET-5-e-AzureTableStorage_12A85/image_8.png"><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/ASP.NET-5-e-AzureTableStorage_12A85/image_thumb_3.png" width="244" height="126" /></a></p> <p>Ulteriore prova che tutto funzioni correttamente si puo’ avere utizzando <a href="https://azurestorageexplorer.codeplex.com/" target="_blank">l’”Azure Storage Explorer”</a>:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/ASP.NET-5-e-AzureTableStorage_12A85/image_10.png"><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/ASP.NET-5-e-AzureTableStorage_12A85/image_thumb_4.png" width="244" height="95" /></a></p><img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101909.aspx" width="1" height="1" /> Pietro Libro http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/11/30/asp.net-5-e-azuretablestorage.aspx Sun, 30 Nov 2014 23:48:00 GMT http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/11/30/asp.net-5-e-azuretablestorage.aspx#feedback http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101909.aspx http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101909.aspx ASP.NET 5 e Entity Framework 7 (beta) http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/11/30/asp.net-5-e-entity-framework-7-beta.aspx <p>Vediamo in questo post come iniziare a giocare con Entity Framework 7 “beta” (in “beta” solo per uniformità con in rilascio della preview di VS 2015, cosi come descritto in questo <a href="http://blogs.msdn.com/b/adonet/archive/2014/11/12/visual-studio-2015-preview-and-entity-framework.aspx" target="_blank">post</a>). Partiamo con aprire VS 2015 e creare un progetto di tipo “ASP.NET 5 Console Application”:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/MVC6-e-Entity-Framework-7_10E1E/image_6.png"><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/MVC6-e-Entity-Framework-7_10E1E/image_thumb_2.png" width="244" height="170" /></a></p> <p>Per utilizzare Entity Framework 7, apriamo il file <em>Project.json</em> e aggiungiamo nella sezione <em>dependencies</em> le tre dipendenze seguenti:</p> <ol> <li>"EntityFramework": "7.0.0-beta1"</li> <li>"EntityFramework.Commands" : "7.0.0-beta1"</li> <li>"EntityFramework.SqlServer": "7.0.0-beta1"</li> </ol> <p>Le dipendenze 1 e 3 ci servono per integrare EF nel nostro progetto ed “informare” che andremo a lavorare utilizzando EF per SQL Server (dato che nella nuova versione, il provider di EF puo’ essere utilzzato nativamente per interagire con <em>SqlServer</em>, <em>SqlLite</em>, <em>AzureTableStorage</em> e <em>InMemory</em>, quindi non solo database relazionali), la dipendenza 3 ci serve per utilizzare i comandi di <em>DB Migration</em> all’interno del nostro progetto.</p> <p>Sempre in <em>Project.json</em> aggiungiamo la sezione <em>Commands</em> con la relativa voce “EF”:</p> <p>"commands": { <br />    "ef": "EntityFramework.Commands" <br />}, <br /></p> <p> </p> <p>Cosi’ che alla fine delle modifiche il file <em>Project.json</em> sia simile a quanto illustrato nella figura seguente:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/MVC6-e-Entity-Framework-7_10E1E/image_28.png"><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/MVC6-e-Entity-Framework-7_10E1E/image_thumb_13.png" width="244" height="165" /></a></p> <p> <br />Aggiungiamo al progetto un file di tipo “ASP.NET Configuration file” (<em>Config.json</em>):</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/MVC6-e-Entity-Framework-7_10E1E/image_10.png"><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/MVC6-e-Entity-Framework-7_10E1E/image_thumb_4.png" width="244" height="170" /></a></p> <p>Il quale di Default si presenta in questo modo:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/MVC6-e-Entity-Framework-7_10E1E/image_12.png"><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/MVC6-e-Entity-Framework-7_10E1E/image_thumb_5.png" width="244" height="44" /></a></p> <p>Nella sezione “Data\DefaultConnection” modifichiamo la voce <em>ConnectionString</em> editando la propietà <em>Database</em> oppure cambiando l’intera stringa di connessione, secondo di dove vogliamo ospitare il nostro database (Istanza di SQL Server Express piuttosto che LocalDB ad esempio). Tramite “NuGet Package Manager” (molto piu’ carino graficamente di quello precedente), aggiungiamo un riferimento al Package “Microsoft.Framework.ConfigurationModel.Json” :</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/MVC6-e-Entity-Framework-7_10E1E/image_14.png"><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/MVC6-e-Entity-Framework-7_10E1E/image_thumb_6.png" width="244" height="120" /></a></p> <p>Aggiungiamo al progetto il file <em>Startup.cs</em>:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/MVC6-e-Entity-Framework-7_10E1E/image_22.png"><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/MVC6-e-Entity-Framework-7_10E1E/image_thumb_10.png" width="244" height="170" /></a></p> <p>E modifichiamolo come segue:</p> <div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:8620001f-96b5-4991-9017-2083cf6e37d2" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"><pre style=" width: 938px; height: 191px;background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #008080;"> 1</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">class</span><span style="color: #000000;"> Startup </span><span style="color: #008080;"> 2</span> <span style="color: #000000;"> { </span><span style="color: #008080;"> 3</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> Microsoft.Framework.ConfigurationModel.IConfiguration Configuration { </span><span style="color: #0000FF;">get</span><span style="color: #000000;">; </span><span style="color: #0000FF;">set</span><span style="color: #000000;">; } </span><span style="color: #008080;"> 4</span> <span style="color: #000000;"> </span><span style="color: #008080;"> 5</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> Startup() </span><span style="color: #008080;"> 6</span> <span style="color: #000000;"> { </span><span style="color: #008080;"> 7</span> <span style="color: #000000;"> Configuration </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Microsoft.Framework.ConfigurationModel.Configuration() </span><span style="color: #008080;"> 8</span> <span style="color: #000000;"> .AddJsonFile(</span><span style="color: #800000;">"</span><span style="color: #800000;">config.json</span><span style="color: #800000;">"</span><span style="color: #000000;">).AddEnvironmentVariables(); </span><span style="color: #008080;"> 9</span> <span style="color: #000000;"> } </span><span style="color: #008080;">10</span> <span style="color: #000000;"> }</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>Aggiungiamo al progetto due nuovi classi C#, “Item” e “ItemDB”, dove “ItemDB” è la classe derivata da <em>System.Data.Entity.DbContext</em> ed “Item” il <em>Data Model</em>:</p> <div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:354721b5-c166-4535-a2b5-b9c53668d10b" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"><pre style=" width: 938px; height: 282px;background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #008080;"> 1</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">class</span><span style="color: #000000;"> Item </span><span style="color: #008080;"> 2</span> <span style="color: #000000;"> { </span><span style="color: #008080;"> 3</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">int</span><span style="color: #000000;"> Id { </span><span style="color: #0000FF;">get</span><span style="color: #000000;">; </span><span style="color: #0000FF;">set</span><span style="color: #000000;">; } </span><span style="color: #008080;"> 4</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> Code { </span><span style="color: #0000FF;">get</span><span style="color: #000000;">; </span><span style="color: #0000FF;">set</span><span style="color: #000000;">; } </span><span style="color: #008080;"> 5</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> Description { </span><span style="color: #0000FF;">get</span><span style="color: #000000;">; </span><span style="color: #0000FF;">set</span><span style="color: #000000;">; } </span><span style="color: #008080;"> 6</span> <span style="color: #000000;"> } </span><span style="color: #008080;"> 7</span> <span style="color: #000000;"> </span><span style="color: #008080;"> 8</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">class</span><span style="color: #000000;"> ItemDB : DbContext </span><span style="color: #008080;"> 9</span> <span style="color: #000000;"> { </span><span style="color: #008080;">10</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> DbSet</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Item</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> Items { </span><span style="color: #0000FF;">get</span><span style="color: #000000;">; </span><span style="color: #0000FF;">set</span><span style="color: #000000;">; } </span><span style="color: #008080;">11</span> <span style="color: #000000;"> </span><span style="color: #008080;">12</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">protected</span><span style="color: #000000;"> </span><span style="color: #0000FF;">override</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> OnConfiguring(DbContextOptions options) </span><span style="color: #008080;">13</span> <span style="color: #000000;"> { </span><span style="color: #008080;">14</span> <span style="color: #000000;"> options.UseSqlServer(Startup.Configuration.Get(</span><span style="color: #800000;">"</span><span style="color: #800000;">Data:DefaultConnection:ConnectionString</span><span style="color: #800000;">"</span><span style="color: #000000;">)); </span><span style="color: #008080;">15</span> <span style="color: #000000;"> } </span><span style="color: #008080;">16</span> <span style="color: #000000;"> }</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>Il nuovo metodo <em>OnConfigure</em> di cui abbiamo eseguito <em>l’override</em> ci permette di specificare quale <em>Data Provider</em> (nel nostro caso SqlServer) lavorerà con il nostro <em>DbContext</em>. <em>UseSqlServer</em> accetta come parametro  una stringa di connessione che recuperiamo dal file <em>Config.json</em> tramite la proprietà <em>Configuration</em> (<em>Microsoft.Framework.ConfigurationModel.IConfiguration</em>) presente nella classe <em>Startup.cs</em>.</p> <p>Per utilizzare EF Migrations, non è ancora finita, in quanto è necessario installare e configurare KVM (<a href="https://github.com/aspnet/Home/wiki/version-manager" target="_blank">K Version Manager</a>), sul sito è presente una piccola guida all’installazione. </p> <p>Apriamo un’istanza di Windows PowerShell (o Command Prompt secondo le preferenze) e ci spostiamo nella directory del nostro progetto, dopo digitiamo il comando “K ef migration add initial”:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/MVC6-e-Entity-Framework-7_10E1E/image_16.png"><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/MVC6-e-Entity-Framework-7_10E1E/image_thumb_7.png" width="244" height="18" /></a></p> <p>Se tutto è stato eseguito correttamente, nel nostro progetto viene aggiunta la classica cartella “Migrations” con tutti i file necessari:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/MVC6-e-Entity-Framework-7_10E1E/image_24.png"><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/MVC6-e-Entity-Framework-7_10E1E/image_thumb_11.png" width="244" height="168" /></a></p> <p>Applichiamo quindi il nostro “piano di migrazione” tramite il comando “migration apply”:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/MVC6-e-Entity-Framework-7_10E1E/image_20.png"><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/MVC6-e-Entity-Framework-7_10E1E/image_thumb_9.png" width="244" height="21" /></a></p> <p>Ora possiamo testare che tutto <em>l’Ambaradan </em>(<img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none" alt="Smile" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/MVC6-e-Entity-Framework-7_10E1E/wlEmoticon-smile_2.png" />) funzioni, modificando la classe <em>Programs.cs</em> in questo modo:</p> <div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:23d1cb5a-b83b-4310-a467-63b1e4d336e2" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"><pre style=" width: 938px; height: 460px;background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #008080;"> 1</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> Main(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">[] args) </span><span style="color: #008080;"> 2</span> <span style="color: #000000;"> { </span><span style="color: #008080;"> 3</span> <span style="color: #000000;"> </span><span style="color: #808080;">///</span><span style="color: #008000;">/Save data.</span><span style="color: #808080;"> </span><span style="color: #008080;"> 4</span> <span style="color: #808080;" /><span style="color: #000000;"> </span><span style="color: #0000FF;">using</span><span style="color: #000000;"> (ItemDB db </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> ItemDB()) </span><span style="color: #008080;"> 5</span> <span style="color: #000000;"> { </span><span style="color: #008080;"> 6</span> <span style="color: #000000;"> db.Items.Add(</span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Item() </span><span style="color: #008080;"> 7</span> <span style="color: #000000;"> { </span><span style="color: #008080;"> 8</span> <span style="color: #000000;"> Code </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Item #1</span><span style="color: #800000;">"</span><span style="color: #000000;">, </span><span style="color: #008080;"> 9</span> <span style="color: #000000;"> Description </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Description #1</span><span style="color: #800000;">"</span><span style="color: #000000;"> </span><span style="color: #008080;">10</span> <span style="color: #000000;"> }); </span><span style="color: #008080;">11</span> <span style="color: #000000;"> </span><span style="color: #008080;">12</span> <span style="color: #000000;"> db.SaveChanges(); </span><span style="color: #008080;">13</span> <span style="color: #000000;"> } </span><span style="color: #008080;">14</span> <span style="color: #000000;"> </span><span style="color: #008080;">15</span> <span style="color: #000000;"> </span><span style="color: #808080;">///</span><span style="color: #008000;">/Load data.</span><span style="color: #808080;"> </span><span style="color: #008080;">16</span> <span style="color: #808080;" /><span style="color: #000000;"> </span><span style="color: #0000FF;">using</span><span style="color: #000000;"> (ItemDB db </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> ItemDB()) </span><span style="color: #008080;">17</span> <span style="color: #000000;"> { </span><span style="color: #008080;">18</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">foreach</span><span style="color: #000000;"> (Item item </span><span style="color: #0000FF;">in</span><span style="color: #000000;"> db.Items) </span><span style="color: #008080;">19</span> <span style="color: #000000;"> { </span><span style="color: #008080;">20</span> <span style="color: #000000;"> Console.WriteLine(</span><span style="color: #800000;">"</span><span style="color: #800000;">Item Id: {0}, Code: {1}, Description : {2}</span><span style="color: #800000;">"</span><span style="color: #000000;">, </span><span style="color: #008080;">21</span> <span style="color: #000000;"> item.Id, item.Code, item.Description); </span><span style="color: #008080;">22</span> <span style="color: #000000;"> } </span><span style="color: #008080;">23</span> <span style="color: #000000;"> } </span><span style="color: #008080;">24</span> <span style="color: #000000;"> </span><span style="color: #008080;">25</span> <span style="color: #000000;"> Console.ReadLine(); </span><span style="color: #008080;">26</span> <span style="color: #000000;"> }</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>E poi avviando il tutto con un bel F5:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/MVC6-e-Entity-Framework-7_10E1E/image_26.png"><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/MVC6-e-Entity-Framework-7_10E1E/image_thumb_12.png" width="244" height="126" /></a></p> <p>Sicuramente la versione 7 di EF è ancora “poco” matura per essere utiizzata in progetti reali, ma questo esempio vuole essere un punto di partenza per scoprire quali novità ci attendono <img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none" alt="Smile" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/MVC6-e-Entity-Framework-7_10E1E/wlEmoticon-smile_2.png" /></p><img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101908.aspx" width="1" height="1" /> Pietro Libro http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/11/30/asp.net-5-e-entity-framework-7-beta.aspx Sun, 30 Nov 2014 13:21:00 GMT http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/11/30/asp.net-5-e-entity-framework-7-beta.aspx#feedback http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101908.aspx http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101908.aspx Asp.Net 5, MVC 6 e Web Api http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/11/23/asp.net-5-mvc-6-e-web-api.aspx <p>E’ qualche mese che non scrivo nulla sul blog, ma gli studi, come la vita, sono andata avanti. Ora eccoci qui a fare qualche test con le nuove versioni delle ultime tecnologie\framework web del mondo Microsoft, che ci regala ogni giorno qualcosa di tecnlogicamente fantastico…alla faccia dei soliti criticoni <img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none" alt="Smile" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/AspNet-5-MVC-6-Web-Api_112BD/wlEmoticon-smile_2.png" />. Torniamo con i piedi per terra e proviamo ad utilizzare le Web Api in un progetto MVC 6 (attualmente in versione beta, ASP.NET 5 fonde i framework MCV e Web Api). Apriamo il nostro VS 2015 preview (scaricabile nella versione ultimate a questo indirizzo: ) e creiamo un nuovo progetto “ASP.NET Web Application”:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/AspNet-5-MVC-6-Web-Api_112BD/image_4.png"><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/AspNet-5-MVC-6-Web-Api_112BD/image_thumb_1.png" width="244" height="170" /></a></p> <p>Poi selezioniamo il template <em>ASP.NET 5 Empty</em>:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/AspNet-5-MVC-6-Web-Api_112BD/image_8.png"><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; margin: 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/AspNet-5-MVC-6-Web-Api_112BD/image_thumb_3.png" width="244" height="183" /></a></p> <p>Attendiamo qualche secondo che Visual Studio crei l’alberatura della soluzione con tutti i relativi file:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/AspNet-5-MVC-6-Web-Api_112BD/image_10.png"><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; margin: 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/AspNet-5-MVC-6-Web-Api_112BD/image_thumb_4.png" width="244" height="195" /></a></p> <p>Notiamo due file in formato “.json”, <em>global.json</em> e <em>project.json</em>, che possiamo editare rispettivamente per i <em>settings</em> e per le <em>references</em> a livello globale (solution) o di singolo progetto. La classe <em>Startup.cs</em> ed in particolare il metodo <em>Configure(…)</em> definisce l’entry point della pipeline di ASP.NET, ed è qui che andremo ad aggiungere il codice necessario all’esecuzione dell’applicazione. Prima, apriamo il file <em>project.json</em>, e nella sezione <em>dependencies </em>aggiungiamo la riga seguente:</p> <div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:31fa74eb-3a4e-4854-8d55-ea86cd323d50" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"><pre class="brush: csharp; gutter: true; first-line: 1; tab-size: 4; toolbar: false; width: 422px; height: 22px;" style=" width: 422px; height: 22px;overflow: auto;">"Microsoft.AspNet.Mvc": "6.0.0-beta1"</pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>Notare come l’editor sia completo di <em>IntelliSense </em>che ci permette di scegliere dinamicamente package e versione (tra quelle disponibili):</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/AspNet-5-MVC-6-Web-Api_112BD/image_12.png"><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; margin: 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/AspNet-5-MVC-6-Web-Api_112BD/image_thumb_5.png" width="244" height="116" /></a></p> <p>Inizializziamo MVC nella classe <em>Startup.cs</em>, aggiungendo il metodo <em>ConfigureServices</em>:</p> <div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:400b0b3f-550e-45e9-a8dc-b48fde71e3c8" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"><pre style=" width: 574px; height: 79px;background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #008080;">1</span> <span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> ConfigureServices(IServiceCollection services) </span><span style="color: #008080;">2</span> <span style="color: #000000;">{ </span><span style="color: #008080;">3</span> <span style="color: #000000;"> services.AddMvc(); </span><span style="color: #008080;">4</span> <span style="color: #000000;">}</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>il quale aggiunge tutte le dipendenze di cui MVC 6 ha bisogno. Utilizziamo il metodo d’estensione <em>UseMvc </em>nel metodo <em>Configure:</em></p> <div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:133d9ce7-f372-4822-b58e-2673ebd60673" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"><pre style=" width: 574px; height: 79px;background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #008080;">1</span> <span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> Configure(IApplicationBuilder app) </span><span style="color: #008080;">2</span> <span style="color: #000000;">{ </span><span style="color: #008080;">3</span> <span style="color: #000000;"> app.UseMvc(); </span><span style="color: #008080;">4</span> <span style="color: #000000;">} </span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>Aggiungiamo una classe <em>ItemsController </em>(“Web Api Controller Class”) nella classica cartella di progetto <em>Controllers</em>:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/AspNet-5-MVC-6-Web-Api_112BD/image_14.png"><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; margin: 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/AspNet-5-MVC-6-Web-Api_112BD/image_thumb_6.png" width="244" height="170" /></a></p> <div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:52bc49db-9ffe-4a96-aece-068adc238076" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"><pre style=" width: 782px; height: 226px;background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #008080;"> 1</span> <span style="color: #000000;">[Route(</span><span style="color: #800000;">"</span><span style="color: #800000;">api/[controller]</span><span style="color: #800000;">"</span><span style="color: #000000;">)] </span><span style="color: #008080;"> 2</span> <span style="color: #000000;" /><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">class</span><span style="color: #000000;"> ItemsController : Controller </span><span style="color: #008080;"> 3</span> <span style="color: #000000;">{ </span><span style="color: #008080;"> 4</span> <span style="color: #000000;"> </span><span style="color: #008000;">//</span><span style="color: #008000;"> GET: api/values </span><span style="color: #008000;"> </span><span style="color: #008080;"> 5</span> <span style="color: #008000;" /><span style="color: #000000;"> [HttpGet] </span><span style="color: #008080;"> 6</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> IEnumerable</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Item</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> Get() </span><span style="color: #008080;"> 7</span> <span style="color: #000000;"> { </span><span style="color: #008080;"> 8</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Item</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">( </span><span style="color: #008080;"> 9</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Item[]{ </span><span style="color: #008080;">10</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Item() { Code</span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Item#1</span><span style="color: #800000;">"</span><span style="color: #000000;">, Description</span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Item_Description#1</span><span style="color: #800000;">"</span><span style="color: #000000;"> }, </span><span style="color: #008080;">11</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Item() { Code </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Item2</span><span style="color: #800000;">"</span><span style="color: #000000;">, Description </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Item_Description#2</span><span style="color: #800000;">"</span><span style="color: #000000;">} }); </span><span style="color: #008080;">12</span> <span style="color: #000000;"> } </span><span style="color: #008080;">13</span> <span style="color: #000000;">}</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>Poi aggiungiamo la classe <em>Item</em>:</p> <div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:8bef8468-3a84-4e1b-b9c2-e6cdc95b167b" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"><pre style=" width: 467px; height: 92px;background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #008080;">1</span> <span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">class</span><span style="color: #000000;"> Item </span><span style="color: #008080;">2</span> <span style="color: #000000;">{ </span><span style="color: #008080;">3</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> Code { </span><span style="color: #0000FF;">get</span><span style="color: #000000;">; </span><span style="color: #0000FF;">set</span><span style="color: #000000;">; } </span><span style="color: #008080;">4</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> Description { </span><span style="color: #0000FF;">get</span><span style="color: #000000;">; </span><span style="color: #0000FF;">set</span><span style="color: #000000;">; } </span><span style="color: #008080;">5</span> <span style="color: #000000;">}</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>Avviamo il progetto ed invochiamo via browser il servizio:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/AspNet-5-MVC-6-Web-Api_112BD/image_16.png"><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; margin: 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/AspNet-5-MVC-6-Web-Api_112BD/image_thumb_7.png" width="244" height="49" /></a></p> <p>Il servizio dovrebbe restituire il seguente json :</p> <div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:6292c1a2-9f59-4ab1-acc2-227a4a001d03" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"><pre style=" width: 640px; height: 51px;background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #008080;">1</span> <span style="color: #000000;">[{</span><span style="color: #800000;">"</span><span style="color: #800000;">Code</span><span style="color: #800000;">"</span><span style="color: #000000;">:</span><span style="color: #800000;">"</span><span style="color: #800000;">Item#1</span><span style="color: #800000;">"</span><span style="color: #000000;">,</span><span style="color: #800000;">"</span><span style="color: #800000;">Description</span><span style="color: #800000;">"</span><span style="color: #000000;">:</span><span style="color: #800000;">"</span><span style="color: #800000;">Item_Description#1</span><span style="color: #800000;">"</span><span style="color: #000000;">} </span><span style="color: #008080;">2</span> <span style="color: #000000;">,{</span><span style="color: #800000;">"</span><span style="color: #800000;">Code</span><span style="color: #800000;">"</span><span style="color: #000000;">:</span><span style="color: #800000;">"</span><span style="color: #800000;">Item2</span><span style="color: #800000;">"</span><span style="color: #000000;">,</span><span style="color: #800000;">"</span><span style="color: #800000;">Description</span><span style="color: #800000;">"</span><span style="color: #000000;">:</span><span style="color: #800000;">"</span><span style="color: #800000;">Item_Description#2</span><span style="color: #800000;">"</span><span style="color: #000000;">}]</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>Notiamo come la classe <em>ItemsController</em> a differenza delle versioni precedenti, non derivi piu’ dalla classe <em>ApiController</em>, ma direttamente da <em>Controller</em>. Se proviamo ad utilizzare uno strumento come <a href="http://www.telerik.com/fiddler" target="_blank">Fiddler</a> per analizzare le <em>request </em>e le <em>response </em>delle nostre Api, possiamo scoprire qualcosa di interessante, se ad esempio, modifichiamo la nostra Web Api in modo da tornare <em>null, c</em>on l’attuale versione di ASP.NET Web Api otterremmo:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/AspNet-5-MVC-6-Web-Api_112BD/image_18.png"><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; margin: 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/AspNet-5-MVC-6-Web-Api_112BD/image_thumb_8.png" width="244" height="56" /></a></p> <p>Ovvero una <em>response </em>con status 200 e corpo del messaggio vuoto, con la versione MVC 6 invece:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/AspNet-5-MVC-6-Web-Api_112BD/image_20.png"><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; margin: 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/AspNet-5-MVC-6-Web-Api_112BD/image_thumb_9.png" width="244" height="31" /></a></p> <p>Una <em>response </em>con status 204 (No Content), che logicamente parlando IMHO è piu’ corretta (la risposta è OK, ma il contenuto del body è vuoto). Ulteriori dettagli sui <em>Formatters</em> in MVC6 possono essere trovati in questo <a href="http://www.strathweb.com/2014/11/formatters-asp-net-mvc-6/" target="_blank">post</a> di Filip W. Per ritornare ad avere un comportamento <em>Old Style</em> è sufficiente agire a livello di configurazione, in <em>ConfigureServices</em>:</p> <div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:9cef9395-8948-42b0-8de5-e233c45d8634" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"><pre style=" width: 781px; height: 92px;background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #008080;">1</span> <span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> ConfigureServices(IServiceCollection services) </span><span style="color: #008080;">2</span> <span style="color: #000000;">{ </span><span style="color: #008080;">3</span> <span style="color: #000000;"> services.AddMvc().Configure</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">MvcOptions</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">(o </span><span style="color: #000000;">=&gt;</span><span style="color: #000000;"> o.OutputFormatters </span><span style="color: #008080;">4</span> <span style="color: #000000;"> .RemoveAll(f </span><span style="color: #000000;">=&gt;</span><span style="color: #000000;"> f.Instance.GetType() </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #0000FF;">typeof</span><span style="color: #000000;">(HttpNoContentOutputFormatter))); </span><span style="color: #008080;">5</span> <span style="color: #000000;">}</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>Ovviamente di novità ci sono e tante, ma almeno sappiamo da dove iniziare <img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none" alt="Smile" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/AspNet-5-MVC-6-Web-Api_112BD/wlEmoticon-smile_2.png" /> . </p><img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101903.aspx" width="1" height="1" /> Pietro Libro http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/11/23/asp.net-5-mvc-6-e-web-api.aspx Sun, 23 Nov 2014 10:17:55 GMT http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/11/23/asp.net-5-mvc-6-e-web-api.aspx#feedback http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101903.aspx http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101903.aspx