EntityFramework http://blogs.ugidotnet.org/ainotame/category/EntityFramework.aspx EntityFramework it Roberto Sarati Subtext Version 2.6.0.0 EF 5 - IS NULL &lt;&gt; = NULL http://blogs.ugidotnet.org/ainotame/archive/2013/05/17/ef-5-is-null-ltgt-null.aspx <p>EF 5 aggiunge una importante opzione di configurazione riguardante la "traduzione" delle lambda con parametri NULL: UseCSharpNullComparisonBehavior. <br />Se impostata a true, il comportamento è simile al comportamento che noi Dev siamo abituati con il valore null di C#. Ma andiamo con ordine:</p> <p>Tabella: <br />Id    Name <br />1    Uno <br />2    NULL <br />3    NULL <br />4    due <br />5    tre</p> <p>Codice: <br /></p> <p>result = db.NullableTables.Where(e =&gt; e.Name == null).Count(); <br />Console.WriteLine("Entries where Name=null: {0}", result); <br />                <br />result = db.NullableTables.Where(e =&gt; e.Name != null).Count(); <br />Console.WriteLine("Entries where Name!=null: {0}", result); <br />                <br />string name = null; <br />result = db.NullableTables.Where(e =&gt; e.Name == name).Count(); <br />Console.WriteLine("Entries where Name==name &amp; name=null: {0}", result);</p> <p>Risultato standard: <br />"Entries where Name=null: 2" //corretto <br />"Entries where Name!=null: 3" //corretto <br />"Entries where Name=name &amp;amp; name=null: 0" //wrong?</p> <p>Il problema dell'ultimo risultato riguarda il metodo utilizzato da EF per convertire la lamba expression "e=&amp;gt;e.Name=name" in TSQL: "Where Name=@p1, @p1=null". In SQL =NULL è sempre false, al contrario del primo esempio dove EF converte la lambda in "where Name IS NULL".</p> <p>Come possiamo rendere la conversione più C# friendly? con la seguente istruzione (messa nel costruttore del nostro DbContext): <br />((IObjectContextAdapter)this).ObjectContext.ContextOptions.UseCSharpNullComparisonBehavior = true;</p> <p>In questo caso, rieseguendo il codice precedente, otterremo il seguente risultato: <br />"Entries where Name=null: 2" //corretto <br />"Entries where Name!=null: 3" //corretto <br />"Entries where Name=name &amp;amp; name=null: 2" //corretto?</p> <p>Da notare come questa opzione sia disabilitata di default(causa compatibilità).</p><img src="http://blogs.ugidotnet.org/ainotame/aggbug/101559.aspx" width="1" height="1" /> Roberto Sarati http://blogs.ugidotnet.org/ainotame/archive/2013/05/17/ef-5-is-null-ltgt-null.aspx Fri, 17 May 2013 22:33:13 GMT http://blogs.ugidotnet.org/ainotame/archive/2013/05/17/ef-5-is-null-ltgt-null.aspx#feedback http://blogs.ugidotnet.org/ainotame/comments/commentRss/101559.aspx http://blogs.ugidotnet.org/ainotame/services/trackbacks/101559.aspx EF CodeFirst Load data http://blogs.ugidotnet.org/ainotame/archive/2012/03/21/ef-codefirst-load-data.aspx <p>Capita, soprattutto nel metodo Seed del IDatabaseInitializer&lt;CTX&gt; o nel nuovo DbMigrationsConfigurations&lt;CTX&gt;, di caricare una certa quantità di dati passando dal DbContext (nel mio caso da una piccola applicazione che parsa alcuni file).</p> <p>Se questa quantità di dati è cospiqua (10000 oggetti), ci si potrebbe ritrovare a perdere un po' di tempo (2 minuti) aspettando che vengano aggiunti al contesto tutti i dati (non sto parlando del tempo di salvataggio, ma di aggiunta al contesto).<br /> Ciò è dovuto al fatto che ogni chiamata al metodo DbSet&lt;Entity&gt;.Add(new object()) chiama implicitamente ObjectContext.DetectChanges().</p> <p>Per evitare questo, basta impostare:</p> <p>Context.Configuration.AutoDetectChangesEnabled = false;</p> <p>Attenzione tuttavia all'uso: "these options are advanced and can potentially introduce subtle bugs into your application if not used correctly" <a href="http://msdn.microsoft.com/en-us/library/gg696177%28v=vs.103%29.aspx">MSDN</a></p> <p> </p><img src="http://blogs.ugidotnet.org/ainotame/aggbug/100881.aspx" width="1" height="1" /> Roberto Sarati http://blogs.ugidotnet.org/ainotame/archive/2012/03/21/ef-codefirst-load-data.aspx Wed, 21 Mar 2012 13:07:43 GMT http://blogs.ugidotnet.org/ainotame/archive/2012/03/21/ef-codefirst-load-data.aspx#feedback http://blogs.ugidotnet.org/ainotame/comments/commentRss/100881.aspx http://blogs.ugidotnet.org/ainotame/services/trackbacks/100881.aspx [LightSwitch] Utilizzare l'ObjectContext ApplicationData da WCF Ria Service http://blogs.ugidotnet.org/ainotame/archive/2011/11/30/lightswitch-utilizzare-lobjectcontext-applicationdata-da-wcf-ria-service.aspx <p>LightSwitch permette di creare/gestire un database al suo interno senza utilizzare strumenti esterni. Questo DB è chiamato ApplicationData e verrà generato in produzione, in fase di deploy, utilizzando una connection string <a target="_blank" href="http://www.lightswitch.it/Contenuti/VediArticoli/tabid/136/ArticleId/61/LightSwitch-Publish-Wizard.aspx">impostata tramite widzard</a>.</p> <p>Cosa avviene in pratica:</p> <p> - La connessione viene memorizzata, sempre con lo stesso nome "_IntrinsicData", all'interno del web.config deployato.<br />  - l'ObjectContext di EF viene autogenerato nel file ServerGenerated\GeneratedArtifacts\ApplicationData.cs</p> <p>Per utilizzare l'ObjectContext in un WCF Ria Service quindi basta:<br />  - Aggiungere il file al progetto WCF Service (As Link dato che verrà rigenerato)<br />  - Recuperare l'ObjectContext nel seguente modo:</p> <pre style="background: white; color: black; font-family: Consolas;"><span style="color: rgb(43, 145, 175);">EntityConnectionStringBuilder</span> builder = <span style="color: blue;">new</span> <span style="color: rgb(43, 145, 175);">EntityConnectionStringBuilder</span>();<br />builder.Metadata =<br /> <span style="color: rgb(163, 21, 21);">"res://*/ApplicationData.csdl|res://*/ApplicationData.ssdl|res://*/ApplicationData.msl"</span>;<br />builder.Provider = <span style="color: rgb(163, 21, 21);">"System.Data.SqlClient"</span>;<br />builder.ProviderConnectionString =<br /> <span style="color: rgb(43, 145, 175);">WebConfigurationManager</span>.ConnectionStrings[<span style="color: rgb(163, 21, 21);">"<strong>_IntrinsicData</strong>"</span>].ConnectionString;<br /><span style="color: blue;">var c</span>ontext = <span style="color: blue;">new</span> <span style="color: rgb(43, 145, 175);"><strong>ApplicationDataObjectContext</strong></span>(builder.ConnectionString);</pre> <p><br /> In questo modo è possibile:<br />  - eseguire query complesse sul nostro db applicativo (quelle supportate dal provider di EF)<br />  - sopperire alle "mancanze espressive" delle query linq generate in LightSwitch e poter utilizzare entità custom definite nella nostra libreria (per esempio a fine reportistici)</p><img src="http://blogs.ugidotnet.org/ainotame/aggbug/100578.aspx" width="1" height="1" /> Roberto Sarati http://blogs.ugidotnet.org/ainotame/archive/2011/11/30/lightswitch-utilizzare-lobjectcontext-applicationdata-da-wcf-ria-service.aspx Wed, 30 Nov 2011 00:20:38 GMT http://blogs.ugidotnet.org/ainotame/archive/2011/11/30/lightswitch-utilizzare-lobjectcontext-applicationdata-da-wcf-ria-service.aspx#feedback 40 http://blogs.ugidotnet.org/ainotame/comments/commentRss/100578.aspx http://blogs.ugidotnet.org/ainotame/services/trackbacks/100578.aspx