<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 5</title>
        <link>http://blogs.ugidotnet.org/PietroLibroBlog/category/Entity Framework 5.aspx</link>
        <description>Entity Framework 5</description>
        <language>it-IT</language>
        <copyright>Pietro Libro</copyright>
        <managingEditor>pietro.libro@libero.it</managingEditor>
        <generator>Subtext Version 2.6.0.0</generator>
        <item>
            <title>EF6 (beta1) - Code First Stored Procedures Mapping</title>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2013/06/26/ef6-beta1-code-first-stored-procedures-mapping.aspx</link>
            <description>&lt;p&gt;Una delle features che sicuramente in molti aspettavano con la nuova release di EF è la possibilità di eseguire il mapping delle entità tramite Stored Procedures. Con la versione 6 di Entity Framework (attualmente in beta 1), abbiamo finalmente questa possibilità, e l'utilizzo è veramente immediato.&lt;/p&gt;  &lt;p&gt;Supponiamo di avere un Domain Model simile a quello mostrato nella figura seguente:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/EF6beta1CodeFirstStoredProceduresMapping_8648/image_2.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/EF6beta1CodeFirstStoredProceduresMapping_8648/image_thumb.png" width="206" height="244" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Dove abbiamo un insieme di oggetti ereditati, ed una &lt;em&gt;navigation property &lt;/em&gt;che collega l'oggeto &lt;em&gt;Car&lt;/em&gt; ad una collezione di oggetti &lt;em&gt;Optional&lt;/em&gt;. &lt;/p&gt;  &lt;p&gt;Aggiungiamo il riferimento ad EF6 utilizzando il gestore di "NuGet Packages" selezionando tra le varie opzioni "Include Prerelease" e poi selezioniamo il package "Entity Framework":&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/EF6beta1CodeFirstStoredProceduresMapping_8648/image_4.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/EF6beta1CodeFirstStoredProceduresMapping_8648/image_thumb_1.png" width="244" height="150" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Eseguiamo la configurazione delle classi che compongono il nostro Domain tramite Code First Fluent Api ed aggiungiamo il codice seguente:&lt;/p&gt;  &lt;pre class="csharpcode"&gt; modelBuilder.Entity&amp;lt;Domain.Car&amp;gt;().MapToStoredProcedures();
 modelBuilder.Entity&amp;lt;Domain.Optional&amp;gt;().MapToStoredProcedures();&lt;/pre&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Il quale "informa" il run-time di Entity Framework che per le entità "Car" ed "Optional" le operazioni di Insert\Delete\Update verranno utilizzate delle Stored Procedures (che rispondono alle convenzioni richieste da EF). &lt;/p&gt;

&lt;p&gt;A questo punto entra in scena EF Migrations ed il "fantastico" comando "Add-Migration", che produce tutto il codice, e non solo, necessario ad aggiornare il database:&lt;/p&gt;

&lt;pre class="csharpcode"&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Up()
        {
            CreateStoredProcedure(
                &lt;span class="str"&gt;"DomusDotNet.Car_Insert"&lt;/span&gt;,
                p =&amp;gt; &lt;span class="kwrd"&gt;new&lt;/span&gt;
                    {
                        Brand = p.String(maxLength: 128),
                        Model = p.String(maxLength: 128),
                        EngineSize = p.String(maxLength: 128),
                        HP = p.Int(),
                        DailyRent = p.Single(),
                        FreeDailyKm = p.Int(),
                        Note = p.String(maxLength: 128),
                    },
                body:
                    &lt;span class="str"&gt;@"INSERT [DomusDotNet].[Vehicles]([Brand], [Model], [EngineSize], [HP], [DailyRent], [FreeDailyKm], [Note])
                      VALUES (@Brand, @Model, @EngineSize, @HP, @DailyRent, @FreeDailyKm, @Note)
                      
                      DECLARE @Id int
                      SELECT @Id = [Id]
                      FROM [DomusDotNet].[Vehicles]
                      WHERE @@ROWCOUNT &amp;gt; 0 and [Id] = scope_identity()
                      
                      INSERT [DomusDotNet].[Cars]([Id])
                      VALUES (@Id)
                      
                      SELECT t0.[Id]
                      FROM [DomusDotNet].[Vehicles] as t0
                      WHERE @@ROWCOUNT &amp;gt; 0 and t0.[Id] = @Id"&lt;/span&gt;
            );
            
           ...&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;Unico neo, se utilizzate uno schema diverso da "dbo" (anche se avete specificato tramite la nuova API HasDefaultSchema("...") lo schema corretto) bisogna modificare manualmente il nome delle Stored Procedures, altrimenti a run-time verrà generata un'eccezione.&lt;/p&gt;

&lt;p&gt;Scriviamo del codice di test tipo:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;int&lt;/span&gt; rowsAffected = 0;

Domain.Car fordFocus = &lt;span class="kwrd"&gt;new&lt;/span&gt; Domain.Car()
{
    Brand = &lt;span class="str"&gt;"FORD"&lt;/span&gt;,
    DailyRent = 45.0f,
    EngineSize = &lt;span class="str"&gt;"1600"&lt;/span&gt;,
    FreeDailyKm = 100,
    HP = 115,
    Model = &lt;span class="str"&gt;"Focus"&lt;/span&gt;,
    Note = &lt;span class="str"&gt;"With Radio and Power Steering."&lt;/span&gt;
};

fordFocus.Optionals.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; Domain.Accesory() { Description = &lt;span class="str"&gt;"Radio Sony"&lt;/span&gt;, Removable = &lt;span class="kwrd"&gt;true&lt;/span&gt;, Price = 10 });
fordFocus.Optionals.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; Domain.Accesory() { Description = &lt;span class="str"&gt;"Power Steering"&lt;/span&gt;, Removable = &lt;span class="kwrd"&gt;false&lt;/span&gt;, Price = 0 });

&lt;span class="kwrd"&gt;using&lt;/span&gt; (Data.CarRentalDB db = &lt;span class="kwrd"&gt;new&lt;/span&gt; Data.CarRentalDB())
{
    db.Cars.Add(fordFocus);
    rowsAffected = db.SaveChanges();
}&lt;/pre&gt;

&lt;p /&gt;&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;Utilizzando il nostro amico "Sql Profiler" vediamo come le operazioni di accesso alla tabella per Insert\Update\Delete utilizzano le Stored Procedures generate in precedenza:

&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/EF6beta1CodeFirstStoredProceduresMapping_8648/image_8.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/EF6beta1CodeFirstStoredProceduresMapping_8648/image_thumb_3.png" width="244" height="130" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Di questo ed altro parleremo in dettaglio durante l'evento &lt;a href="mailto:EF@Work"&gt;EF@Work&lt;/a&gt; organizzato da DomusDotNet :-)&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101596.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2013/06/26/ef6-beta1-code-first-stored-procedures-mapping.aspx</guid>
            <pubDate>Wed, 26 Jun 2013 10:30:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2013/06/26/ef6-beta1-code-first-stored-procedures-mapping.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101596.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101596.aspx</trackback:ping>
        </item>
        <item>
            <title>Web API: Circular Object References</title>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/08/22/web-api-circular-object-references.aspx</link>
            <description>&lt;p&gt;Quando utilizziamo le Web API, per leggere e scrivere oggetti nel corpo di un messaggio Http utilizziamo delle classi particolari, le media-type formatters. "Gratis" Web API fornisce media-type formatters per JSON e XML, utilizzate secondo della richiesta da parte dei client (“Accept”). Se JSON e XML non sono i "formati" di cui abbiamo bisogno possiamo sempre creare la nostra classe derivata da &lt;em&gt;MediaTypeFormatter&lt;/em&gt; o &lt;em&gt;BufferedMediaTypeFormatter&lt;/em&gt;, rispettivamente per scenari asincroni o sincroni, ma non sono l’argomento di questo post promemoria.&lt;/p&gt;  &lt;p&gt;Quando abbiamo a che fare con grafi di oggetti complessi, possono crearsi situazioni in cui abbiamo riferimenti circolari tra oggetti. Ad esempio in uno scenario di questo tipo:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/4c85039d270e_1360F/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/4c85039d270e_1360F/image_thumb.png" width="244" height="161" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Dove abbiamo due classi, Book ed Author , referenziate tramite &lt;em&gt;collection&lt;/em&gt; (praticamente un’associazione molti-a-molti) l’una con l’altra. &lt;/p&gt;  &lt;p&gt;Se abbiamo una Web API di questo tipo :&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; BookshelfDb _db = &lt;span class="kwrd"&gt;new&lt;/span&gt; BookshelfDb();
&lt;span class="kwrd"&gt;public&lt;/span&gt; IEnumerable&amp;lt;Book&amp;gt; GetBooks()
{
    &lt;span class="kwrd"&gt;return&lt;/span&gt; _db.Books.Include(b =&amp;gt; b.Authors).AsEnumerable();
}
...&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;ed una configurazione standard delle Web API, ad eccezione dell’indentatura:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;JsonMediaTypeFormatter json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.Indent = &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;In presenza di dati, invocando GetBooks() (ad esempio tramite browser), otterremo un’eccezione di questo tipo:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;{ 
  &lt;span class="str"&gt;"Message"&lt;/span&gt;: &lt;span class="str"&gt;"An error has occurred."&lt;/span&gt;, 
  &lt;span class="str"&gt;"ExceptionMessage"&lt;/span&gt;: &lt;span class="str"&gt;"The 'ObjectContent`1' type failed to serialize the response body for content type 'application/json; charset=utf-8'."&lt;/span&gt;, 
  &lt;span class="str"&gt;"ExceptionType"&lt;/span&gt;: &lt;span class="str"&gt;"System.InvalidOperationException"&lt;/span&gt;, 
  &lt;span class="str"&gt;"StackTrace"&lt;/span&gt;: &lt;span class="kwrd"&gt;null&lt;/span&gt;, 
  &lt;span class="str"&gt;"InnerException"&lt;/span&gt;: { 
    &lt;span class="str"&gt;"Message"&lt;/span&gt;: &lt;span class="str"&gt;"An error has occurred."&lt;/span&gt;, 
    &lt;span class="str"&gt;"ExceptionMessage"&lt;/span&gt;: &lt;span class="str"&gt;"&lt;strong&gt;Self referencing loop detected with&lt;/strong&gt; type 'BookshelfWebApi.Models.Book'. Path '[0].Authors[0].Books'."&lt;/span&gt;, 
    &lt;span class="str"&gt;"ExceptionType"&lt;/span&gt;: &lt;span class="str"&gt;"Newtonsoft.Json.JsonSerializationException"&lt;/span&gt;, 
    &lt;span class="str"&gt;"StackTrace"&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;La soluzione al problema è abbastanza semplice  in quanto è sufficiente aggiungere la riga:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.All;&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;Il caso Xml, non è immediato come nel caso JSON, in quanto è necessario decorare le classi con l’attributo &lt;em&gt;DataContract&lt;/em&gt; impostando la proprietà &lt;em&gt;IsReference&lt;/em&gt; a &lt;em&gt;true&lt;/em&gt;. In questo caso però è necessario decorare anche le proprietà con l’attributo &lt;em&gt;DataMember&lt;/em&gt;:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;[DataContract(IsReference = &lt;span class="kwrd"&gt;true&lt;/span&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; Book()
    {
        &lt;span class="kwrd"&gt;this&lt;/span&gt;.Authors = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;Author&amp;gt;();
    }
    [DataMember()]
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Id { get; set; }
    [DataMember()]
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Paperback { get; set; }
    [DataMember()]
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Title { get; set; }
    [DataMember()]
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; ISBN_10 { get; set; }
    [DataMember()]
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; ISBN_13 { get; set; }
    [DataMember()]
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Language { get; set; }
    [DataMember()]
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Publisher { get; set; }
    [DataMember()]
    &lt;span class="kwrd"&gt;public&lt;/span&gt; ICollection&amp;lt;Author&amp;gt; Authors { 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;Se non si vuole “sporcare” le classi “farcendole” di attributi possiamo optare per un &lt;em&gt;DataContractSerializer. &lt;/em&gt;Le Web API possono essere configurate modificando il codice presente nella classe WebApiConfig.cs:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/4c85039d270e_1360F/image_4.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/4c85039d270e_1360F/image_thumb_1.png" width="244" height="225" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quanto detto è sicuramente famigliare per chi espone entità collegate tramite Http, ad esempio utilizzando WCF.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101168.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/08/22/web-api-circular-object-references.aspx</guid>
            <pubDate>Wed, 22 Aug 2012 11:17:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/08/22/web-api-circular-object-references.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101168.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101168.aspx</trackback:ping>
        </item>
        <item>
            <title>EF5 Released</title>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/08/16/ef5-released.aspx</link>
            <description>&lt;p&gt;Con l’arrivo in RTM di Windows 8 e Visual Studio 2012 è stata rilasciata la nuova versione di Entity Framework (scaricabile ovviamente tramite NuGet). Le novità presenti sono diverse, quella più “gettonata” è sicuramente il supporto agli “Enum”. Diverse novità coinvolgono anche il Designer di EF per Visual Studio 2012, come il supporto a diagrammi multipli per lo stesso modello (una delle funzionalità che più apprezzo).&lt;/p&gt;  &lt;p&gt; Per tutti i dettagli del caso, per la compatibilità delle funzioni utilizzabili secondo del targeting del .NET Framework, lista dei bug corretti ed altro, è possibile iniziare da &lt;a href="http://blogs.msdn.com/b/adonet/archive/2012/08/15/ef5-released.aspx" target="_blank"&gt;qui&lt;/a&gt;. &lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101156.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/08/16/ef5-released.aspx</guid>
            <pubDate>Thu, 16 Aug 2012 08:54:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/08/16/ef5-released.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101156.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101156.aspx</trackback:ping>
        </item>
        <item>
            <title>EF5 RC</title>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/05/16/ef5-rc.aspx</link>
            <description>&lt;p&gt;Rilasciata la versione Release Candidate di Entity Framework 5. Il download al solito è disponibile tramite NuGet sia per .Net 4 (in questo caso alcune features non sono supportate, come Enum e Spatial Data) e .Net 4.5.&lt;/p&gt;
&lt;p&gt;Dettagli e nuovi  Walkthrough disponibili sul blog del team di &lt;a href="http://blogs.msdn.com/b/adonet/archive/2012/05/15/ef5-release-candidate-available-on-nuget.aspx"&gt;ADO.NET&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101003.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/05/16/ef5-rc.aspx</guid>
            <pubDate>Wed, 16 May 2012 10:58:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/05/16/ef5-rc.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101003.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101003.aspx</trackback:ping>
        </item>
    </channel>
</rss>