NHibernate http://blogs.ugidotnet.org/crad/category/NHibernate.aspx Un eccezionale ORM open source it-IT Marco De Sanctis Subtext Version 2.6.0.0 [NHibernate] Mapping di un dictionary http://blogs.ugidotnet.org/crad/archive/2008/02/05/nhibernate-mapping-di-un-dictionary.aspx <p>Non mi stancherò mai di decantare la versatilità di NHibernate nel supportare domain model eterogenei. Esempio pratico: il nostro sito internet ha un sacco di pagine pressoché statiche, tipo il classico "Chi siamo", "Mission dell'Azienda", ecc.ecc.</p> <p>Vogliamo permettere all'amministratore di inserire questi dati nel DB, ma vogliamo anche lasciarci la strada aperta ad aggiunte future, così se domani il cliente si sveglia e vuole anche una bella pagina con i contatti, possiamo aggiungerla senza modificare lo schema.</p> <p>Un'idea può essere quella di contenere tutti questi dati all'interno di un bel Dictionary, ma come lo mappiamo con NHibernate?</p> <p>Presto detto, basta utilizzare il tag &lt;map&gt; come segue:</p> <p> </p><div class="wlWriterSmartContent" id="F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:6ed330ec-560a-4cc4-9592-8a1d13ed4773" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="width:100%;background-color:#EEEEEE;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #999999;">1</span> <span style="color: #0000FF;">&lt;</span><span style="color: #800000;">map </span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="CustomElements"</span><span style="color: #FF0000;"> generic</span><span style="color: #0000FF;">="true"</span><span style="color: #FF0000;"> table</span><span style="color: #0000FF;">="WebsiteCustomElements"</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #999999;">2</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">key </span><span style="color: #FF0000;">column</span><span style="color: #0000FF;">="ParentId"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;"> </span><span style="color: #999999;">3</span> <span style="color: #000000;"> </span><span style="color: #999999;">4</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">index </span><span style="color: #FF0000;">column</span><span style="color: #0000FF;">="ItemName"</span><span style="color: #FF0000;"> type</span><span style="color: #0000FF;">="string"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;"> </span><span style="color: #999999;">5</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">element </span><span style="color: #FF0000;">column</span><span style="color: #0000FF;">="Value"</span><span style="color: #FF0000;"> type</span><span style="color: #0000FF;">="string"</span><span style="color: #FF0000;"> length</span><span style="color: #0000FF;">="3000"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;"> </span><span style="color: #999999;">6</span> <span style="color: #000000;"></span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">map</span><span style="color: #0000FF;">&gt;</span></div></pre></div> <p>In questo modo NHibernate utilizzerà una tabella WebsiteCustomElements con le colonne ParentId, ItemName e Value per persistere il contenuto del nostro Dictionary.</p> <p> </p><div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:712d7199-568a-4922-9545-3b6a5bb56ce2" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati tags: <a href="http://technorati.com/tags/NHibernate" rel="tag">NHibernate</a></div><img src="http://blogs.ugidotnet.org/crad/aggbug/91013.aspx" width="1" height="1" /> Marco De Sanctis http://blogs.ugidotnet.org/crad/archive/2008/02/05/nhibernate-mapping-di-un-dictionary.aspx Tue, 05 Feb 2008 02:12:04 GMT http://blogs.ugidotnet.org/crad/archive/2008/02/05/nhibernate-mapping-di-un-dictionary.aspx#feedback 8 http://blogs.ugidotnet.org/crad/comments/commentRss/91013.aspx Un buon esempio di IoC e separation of concerns http://blogs.ugidotnet.org/crad/archive/2007/11/29/un-buon-esempio-di-ioc-e-separation-of-concerns.aspx <p>Parlo di <a href="http://www.cuyahoga-project.org/">Cuyahoga</a>, il noto CMS basato su <a href="http://www.castleproject.org/index.html">Castle Windsor</a> e <a href="http://www.hibernate.org/343.html">NHibernate</a>. Incuriosito da <a href="http://ayende.com/Blog/archive/2007/11/28/Code-Review-PetShop-3.0.aspx">questo post</a> di <a href="http://ayende.com/Blog/Default.aspx">Ayende</a> ieri ne ho spulciato un po' i sorgenti. E visto che li considero didatticamente interessanti, ve li consiglio.</p> <p>Certo, non è da prendere tutto come oro colato (il modulo del Forum, ad esempio, espone tutti i servizi in una grande, enorme, monolitica classe, che accede direttamente a NHibernate, brrrrr...) però può essere una buona sorgente per qualche idea.</p> <p>Tanto per dirne una, mi è piaciuta la strutturazione del Data Access Layer che sfrutta la "trasversalità" di NHibernate: IUserDao espone solo i servizi specifici dell'utente (es. Autenticazione, GetByUsername), mentre i servizi generici (GetById, ListAll, ecc.ecc.) sono forniti da ICommonDao, che però avrei preferito sfruttasse i generics.</p> <p>Magari se non avete nulla di interessante da leggere nel vostro feed aggregator, dateci un'occhiata!</p> <p> </p><div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:6bf9b668-6803-429a-9a38-86dfe1fe882f" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati tags: <a href="http://technorati.com/tags/Architettura" rel="tag">Architettura</a>, <a href="http://technorati.com/tags/NHibernate" rel="tag">NHibernate</a>, <a href="http://technorati.com/tags/Castle%20Windsor" rel="tag">Castle Windsor</a></div><img src="http://blogs.ugidotnet.org/crad/aggbug/90010.aspx" width="1" height="1" /> Marco De Sanctis http://blogs.ugidotnet.org/crad/archive/2007/11/29/un-buon-esempio-di-ioc-e-separation-of-concerns.aspx Thu, 29 Nov 2007 13:12:28 GMT http://blogs.ugidotnet.org/crad/archive/2007/11/29/un-buon-esempio-di-ioc-e-separation-of-concerns.aspx#feedback 4 http://blogs.ugidotnet.org/crad/comments/commentRss/90010.aspx Automatic Properties di C# 3.0: servono davvero? http://blogs.ugidotnet.org/crad/archive/2007/08/08/87587.aspx <p>C# 3.0 permette una notazione compatta per le proprietà che si limitano semplicemente a wrappare un corrispondente field:</p> <div class="CodeFormatContainer"> <style><!-- .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; } --></style> <div class="csharpcode"><pre><span class="lnum"> 1: </span><span class="kwrd">public</span> <span class="kwrd">string</span> Descrizione { get; set; }</pre></div></div> <p>Sulle prime mi è sembrata un'innovazione piuttosto utile, se non altro per le entity di dominio, che notoriamente non hanno logica e che risultano essere parecchio più veloci da scrivere e leggibili. Così utili che ho anche realizzato un accessor per farle supportare da NHibernate (lo trovate <a href="http://www.marcodesanctis.it/public/Crad.NHibernate.Extras.zip" target="_blank">qui</a>).</p> <p>Poi ho iniziato a sperimentare un po' e... beh... mi convincono fino ad un certo punto. Perchè? Beh, ovviamente devono avere sia il getter che il setter, quindi niente proprietà readonly per le collection, tanto per dirne una, a meno di non definire il set come privato. Ma farlo vuol dire inizializzare la proprietà nel costruttore. Quindi ciò che prima era così</p> <div class="CodeFormatContainer"> <div class="csharpcode"><pre class="alt"><span class="lnum"> 1: </span><span class="kwrd">private</span> IList&lt;Dettaglio&gt; dettagli = <span class="kwrd">new</span> List&lt;Dettaglio&gt;();</pre><pre><span class="lnum"> 2: </span><span class="kwrd">public</span> IList&lt;Dettaglio&gt; Dettagli</pre><pre class="alt"><span class="lnum"> 3: </span>{</pre><pre><span class="lnum"> 4: </span> get { <span class="kwrd">return</span> dettagli; }</pre><pre class="alt"><span class="lnum"> 5: </span>}</pre></div></div> <p>ora diviene così</p> <div class="CodeFormatContainer"> <div class="csharpcode"><pre class="alt"><span class="lnum"> 1: </span><span class="kwrd">public</span> IList&lt;Dettaglio&gt; Dettagli { get; <span class="kwrd">private</span> set; }</pre><pre><span class="lnum"> 2: </span><span class="kwrd">public</span> MyClass()</pre><pre class="alt"><span class="lnum"> 3: </span>{</pre><pre><span class="lnum"> 4: </span> <span class="kwrd">this</span>.Dettagli = <span class="kwrd">new</span> List&lt;Dettaglio&gt;();</pre><pre class="alt"><span class="lnum"> 5: </span>}</pre></div></div> <p>Non un gran guadagno, isn't it? E perché non usare solo per queste proprietà la sintassi classica? Risposta semplice: solitamente (è noto) uso NHibernate e non mi piace l'idea di dover utilizzare due strategy diverse per accedere ai field sottostanti.</p> <p>Mettiamola così: magari più in là cambierò idea, ma ora come ora preferisco la strategia dell'ottimo Reshareper, che mi permette di fare qualcosa del tipo (tratto dalla trial della versione 3.0)...</p> <p><a href="http://www.marcodesanctis.it/images/Blog/AutomaticPropertiesdiC3.0servonodavvero_13A17/image.png" atomicselection="true"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="132" alt="image" src="http://www.marcodesanctis.it/images/Blog/AutomaticPropertiesdiC3.0servonodavvero_13A17/image_thumb.png" width="240" border="0" /></a> <a href="http://www.marcodesanctis.it/images/Blog/AutomaticPropertiesdiC3.0servonodavvero_13A17/image_3.png" atomicselection="true"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="143" alt="image" src="http://www.marcodesanctis.it/images/Blog/AutomaticPropertiesdiC3.0servonodavvero_13A17/image_thumb_3.png" width="240" border="0" /></a> </p> <p><a href="http://www.marcodesanctis.it/images/Blog/AutomaticPropertiesdiC3.0servonodavvero_13A17/image_4.png" atomicselection="true"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="240" alt="image" src="http://www.marcodesanctis.it/images/Blog/AutomaticPropertiesdiC3.0servonodavvero_13A17/image_thumb_4.png" width="178" border="0" /></a></p> <p> </p> <div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:42f0d958-6aa5-422b-b85a-f9d545d24dcc" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati tags: <a href="http://technorati.com/tags/.Net%203.5" rel="tag">.Net 3.5</a></div><img src="http://blogs.ugidotnet.org/crad/aggbug/87587.aspx" width="1" height="1" /> Marco De Sanctis http://blogs.ugidotnet.org/crad/archive/2007/08/08/87587.aspx Wed, 08 Aug 2007 23:47:00 GMT http://blogs.ugidotnet.org/crad/archive/2007/08/08/87587.aspx#feedback 2 http://blogs.ugidotnet.org/crad/comments/commentRss/87587.aspx NHibernate su Aspitalia.com http://blogs.ugidotnet.org/crad/archive/2007/06/19/82730.aspx <p>Oramai non ne faccio più mistero: chiacchierare di <a href="http://www.nhibernate.org">NHibernate</a> mi piace dannatamente, cercare di contribuire alla sua diffusione ancora di più, sfruttarlo per scopi professionali è poi una vera goduria.</p> <p>Fatto sta che ho rotto talmente le scatole a <a href="http://blogs.aspitalia.com/imperugo/">qualcuno</a>, che alla fine abbiamo convenuto che era meglio mettere nero su bianco e vedere cosa si riusciva a tirar fuori. Risultato? Oltre le più rosee aspettative: <a href="http://www.aspitalia.com/articoli/architettura/nhibernate.aspx">un articolo</a> introduttivo e *MOLTO* pratico, pubblicato oggi su <a href="http://www.aspitalia.com">Aspitalia.com</a>, e addirittura <a href="http://www.aspitalia.com/focuson/970/Speciale-NHibernate-ORM-Incontra-Database.aspx">uno speciale</a> su quello che è un po' l'ORM del momento.</p> <p>Ringrazio tantissimo <a href="http://blogs.aspitalia.com/daniele/">Daniele</a>, <a href="http://blogs.aspitalia.com/rickyvr/">Ricky</a>, <a href="http://blogs.aspitalia.com/imperugo/">Ugo</a> e <a href="http://blogs.aspitalia.com/nostromo/">Marco</a> di <a href="http://www.aspitalia.com/">Aspitalia.com</a> che mi hanno supportato in questa che per me è una grandissima soddisfazione, spero che i riscontri siano positivi, così magari potrò convincerli a pubblicare un seguito, magari su argomenti più avanzati! ;-)</p> <p> </p> <div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:c61db335-cbab-4394-9a79-c4fc9e551293" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati tags: <a href="http://technorati.com/tags/NHibernate" rel="tag">NHibernate</a></div><img src="http://blogs.ugidotnet.org/crad/aggbug/82730.aspx" width="1" height="1" /> Marco De Sanctis http://blogs.ugidotnet.org/crad/archive/2007/06/19/82730.aspx Tue, 19 Jun 2007 15:01:00 GMT http://blogs.ugidotnet.org/crad/archive/2007/06/19/82730.aspx#feedback 3 http://blogs.ugidotnet.org/crad/comments/commentRss/82730.aspx [NH e le feature semisconosciute] La cache di 2&deg; livello http://blogs.ugidotnet.org/crad/archive/2007/06/07/80711.aspx <p>E' innegabile che, nell'ultimo anno, si faccia un gran parlare in rete di O/RM ed in particolare di NHibernate. Capita sempre più spesso di leggere un post qui, un articolo lì e soprattuto tante, tantissime domande su forum e newsgroup di persone in qualche modo affascinate o incuriosite da questo modo relativamente nuovo di gestire le problematiche di persistenza.</p> <p>Ciò che mi ha sempre colpito è come, a ragion veduta, in molti vedano in NHibernate un qualcosa che finalmente si occupa di scrivere SQL al posto nostro. Ma in realtà c'è molto, molto di più in quel dannato assembly, features che tante volte passano quasi inosservate, che raramente sono citate in articoli, ma che invece rappresentano tutte, secondo me, piccole rivoluzioni nel modo in cui scrivere il nostro data access layer.</p> <p>Un esempio tipico è quello della cache di secondo livello. Ho recentemente sviluppato un piccolo CMS e l'ho fatto tralasciando (volutamente) l'argomento caching, leggendo ogni volta che ne avevo bisogno i dati sul database. L'ho fatto perché ho preferito focalizzare la mia attenzione su altri aspetti, perché la cache a mio modo di vedere deve essere uno strato intermedio tra il DAL e il layer superiore, e soprattutto perché secondo me deve essere il più possibile trasparente ad entrambi.</p> <p>Bene, ad applicazione completata e funzionante, già installata in un server per fini dimostrativi, quanto costa implementare un sistema di caching? Con NHibernate è bastato inserire un paio di righe su file di configurazione e un elemento &lt;cache&gt; nel mapping di ogni entità.</p> <p>Risultato: il CMS ha iniziato a memorizzare nella cache di ASP.NET (ma supporta anche cache distribuita in scenari webfarm) ogni entità recuperata dal DB, preoccupandosi automaticamente di invalidarla ad ogni nuova scrittura. Ho potuto controllare quanto tempo al massimo una entry può restare in cache, quante entità di dominio voglio memorizzare e quali possono essere considerate invariabili.</p> <p>Il tutto *SENZA SCRIVERE UNA RIGA DI CODICE*.</p> <p>Fate voi.</p> <p> </p> <div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:2877e9fb-f11d-4711-a40a-b5f3eeaee389" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati tags: <a href="http://technorati.com/tags/NHibernate" rel="tag">NHibernate</a></div><img src="http://blogs.ugidotnet.org/crad/aggbug/80711.aspx" width="1" height="1" /> Marco De Sanctis http://blogs.ugidotnet.org/crad/archive/2007/06/07/80711.aspx Thu, 07 Jun 2007 22:57:00 GMT http://blogs.ugidotnet.org/crad/archive/2007/06/07/80711.aspx#feedback 2 http://blogs.ugidotnet.org/crad/comments/commentRss/80711.aspx NHibernate Search http://blogs.ugidotnet.org/crad/archive/2007/04/02/74474.aspx <p><a href="http://ayende.com/Blog/archive/2007/04/02/NHibernate-Search.aspx">Come segnalato</a> da Ayende, è oramai praticamente completo NHibernate.Search. Cos'è? E' l'integrazione con NHibernate del famoso full-text search engine Lucene.</p> <p>La documentazione non è ancora disponibile, ma il funzionamento è assolutamente analogo a quello della controparte Java, che si trova <a href="http://www.hibernate.org/5.html#A18">qui</a>.</p> <p>Non vedo l'ora di dargli un'occhiata.</p> <p> </p> <div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:3f265876-57f7-45ec-9775-7425f091c984" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati tags: <a href="http://technorati.com/tags/NHibernate" rel="tag">NHibernate</a></div><img src="http://blogs.ugidotnet.org/crad/aggbug/74474.aspx" width="1" height="1" /> Marco De Sanctis http://blogs.ugidotnet.org/crad/archive/2007/04/02/74474.aspx Mon, 02 Apr 2007 15:34:00 GMT http://blogs.ugidotnet.org/crad/archive/2007/04/02/74474.aspx#feedback http://blogs.ugidotnet.org/crad/comments/commentRss/74474.aspx Stasera la chat sugli ORM http://blogs.ugidotnet.org/crad/archive/2007/01/22/67967.aspx <p>Ancora grazie ad <a href="http://blogs.ugidotnet.org/blogema/">Emanuele</a> per aver pensato a questa iniziativa. Farò di tutto per non mancare, perché l'argomento mi appassiona tantissimo (oltre che essere di estrema attualità).</p> <p>Appuntamento alle ore 21, le modalità di partecipazione sono descritte in <a href="http://blogs.ugidotnet.org/BlogEma/archive/2007/01/08/65513.aspx">qui</a>.</p><img src="http://blogs.ugidotnet.org/crad/aggbug/67967.aspx" width="1" height="1" /> Marco De Sanctis http://blogs.ugidotnet.org/crad/archive/2007/01/22/67967.aspx Mon, 22 Jan 2007 12:58:00 GMT http://blogs.ugidotnet.org/crad/archive/2007/01/22/67967.aspx#feedback http://blogs.ugidotnet.org/crad/comments/commentRss/67967.aspx [NHibernate] Session.Get o Session.Load ? http://blogs.ugidotnet.org/crad/archive/2007/01/16/nhibernate_session_get_session_load.aspx <p>L'interfaccia ISession di NHibernate mette a disposizione due metodi per recuperare una entity da DB a partire dal suo identificativo, ossia <em>ISession.Get</em> e <em>ISession.Load</em>. </p> <p>La prima differenza che salta all'occhio è che, nel caso l'oggetto voluto non esista, Get ritorna una null-reference, mentre Load solleva una <em>ObjectNotFoundException</em>. Molto più importante, secondo me, è però il fatto che, nel caso in cui il tipo sia configurato come Lazy Initializable (quindi attributo Lazy="true" nel mapping della classe), Session.Load restituisce il proxy e non l'oggetto stesso.</p> <p>E' un aspetto molto comodo tutte le volte in cui abbiamo bisogno di una reference ad un oggetto di cui non conosciamo altro che l'Id (ad esempio perché ci proviene da una DropDownList). L'uso di Session.Load, in questo caso, ci permette di ottenere questa reference senza passare per il database (o per la cache); ovviamente non sarà riferita all'oggetto vero e proprio, che non viene caricato finché non proviamo ad accedervi, però è comunque ritenuta valida da NHibernate ai fini della persistenza.</p> <p>Attenzione, però, a due subdoli inconvenienti. Intanto se usiamo Session.Load non è assolutamente detto che il tipo restituito sia ciò che ci aspettiamo, quindi <strong>MAI</strong> fare un test del genere</p> <p> </p><div class="wlWriterSmartContent" id="F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:3c835350-869b-4b16-b2c8-db96e492e82a" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="width:100%;background-color:#EEEEEE;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #000000;">myObject </span><span style="color: #000000;">=</span><span style="color: #000000;"> session.Load</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">MyObjectType</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">(id); </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (myObject.GetType() </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #0000FF;">typeof</span><span style="color: #000000;">(MyObjectType)) </span><span style="color: #008000;">//</span><span style="color: #008000;"> do something</span></div></pre></div> <p>perché potrebbe avere risultati non predicibili; è molto più corretto scrivere</p> <p> </p><div class="wlWriterSmartContent" id="F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:01d938c8-5f9f-4d70-9395-5220121036ab" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="width:100%;background-color:#EEEEEE;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #0000FF;">if</span><span style="color: #000000;"> (myObject </span><span style="color: #0000FF;">is</span><span style="color: #000000;"> MyObjectType) </span><span style="color: #008000;">//</span><span style="color: #008000;"> do something</span></div></pre></div> <p>Inoltre bisogna sapere che, nel caso in cui l'oggetto sia configurato per il LazyLoad e l'id non esista, la ObjectNotFoundException verrà sollevata <strong>al primo utilizzo dell'oggetto stesso, e non in corrispondenza del metodo Session.Load</strong>.</p> <p>Morale della favola: se si è ragionevolmente sicuri che l'id esista, usate pure Load. Ma se lo fate, state attenti perché è comunque più complesso da gestire.</p><div style="margin: 0px; padding: 0px; display: inline;" contenteditable="false" class="wlWriterSmartContent">Technorati tags: <a rel="tag" href="http://technorati.com/tags/NHibernate">NHibernate</a></div><img src="http://blogs.ugidotnet.org/crad/aggbug/67195.aspx" width="1" height="1" /> Marco De Sanctis http://blogs.ugidotnet.org/crad/archive/2007/01/16/nhibernate_session_get_session_load.aspx Tue, 16 Jan 2007 17:03:00 GMT http://blogs.ugidotnet.org/crad/archive/2007/01/16/nhibernate_session_get_session_load.aspx#feedback http://blogs.ugidotnet.org/crad/comments/commentRss/67195.aspx [NHibernate] Nuovo connection model, cosa cambia? http://blogs.ugidotnet.org/crad/archive/2007/01/11/65967.aspx <p><a href="http://blogs.ugidotnet.org/janky">Janky</a> ha scritto <a href="http://blogs.ugidotnet.org/janky/archive/2007/01/11/65946.aspx">in questo post</a> che una delle novità della <a href="http://sourceforge.net/project/showfiles.php?group_id=73818&amp;package_id=73969&amp;release_id=477442">nuova beta</a> di NHiberante 1.2.0 è il nuovo connection model. Qual è la differenza?</p> <p>Piccola premessa: è (ed era) possibile fornire alla session una propria connessione, creata esternamente a NHibernate, quindi; in questo caso sarà sempre responsabilità dell'utente gestirne il ciclo di vita.</p> <p>E nel caso (più comune) in cui lasciamo fare a NHibernate?</p> <p><strong>Prima di beta 3</strong></p> <p>La connessione veniva aperta alla prima occasione in cui si rendeva necessaria un'interazione con il DB e da quel momento restava aperta fino alla dispose della Session o ad una chiamata al suo metodo Close(). In questo caso, quindi, era consigliato utilizzare la session all'interno di un blocco using secondo il pattern</p> <ol> <li>Creo l'oggetto session</li> <li>get/update/save di un oggetto</li> <li>apporto le modifiche</li> <li>invoco&nbsp;il Flush() (o meglio il Commit() della transazione)</li> <li>invoco&nbsp;Session.Dispose()</li></ol> <p>Chi era presente al <a href="http://dotnetmarche.org/blogs/news/archive/2006/11/20/2_B000_-Workshop-_2200_Sviluppare-applicazioni-_2700_migliori_27003A00_-CruiseControl.NET-_2600_-NHibernate_2200_.aspx">workshop</a> di <a href="http://dotnetmarche.org/default.aspx">DotNetMarche</a>, ha avuto modo di vedere che tutti gli esempi che io e Giancarlo abbiamo mostrato, seguivano bene o male questa sequenza.</p> <p><strong>Dalla beta 3</strong></p> <p>La connessione viene aperta alla prima occasione in cui è necessario e viene chiusa immediatamente dopo aver terminato l'esecuzione delle operazioni scheduled. Ovviamente non ci sono&nbsp;penalizzazioni&nbsp;a livello di performance grazie al connection pooling. Il vantaggio di questo approccio è che, a tutti gli effetti, ci permette di tenere in vita la&nbsp;Session per più tempo, senza per questo incorrere in inutili sprechi di risorse.</p><img src="http://blogs.ugidotnet.org/crad/aggbug/65967.aspx" width="1" height="1" /> Marco De Sanctis http://blogs.ugidotnet.org/crad/archive/2007/01/11/65967.aspx Thu, 11 Jan 2007 14:02:00 GMT http://blogs.ugidotnet.org/crad/archive/2007/01/11/65967.aspx#feedback http://blogs.ugidotnet.org/crad/comments/commentRss/65967.aspx La mia sull'evento di DotNetMarche http://blogs.ugidotnet.org/crad/archive/2006/12/18/60029.aspx <FONT face=Verdana size=2> <P>Scrivo solo oggi perché ho avuto un weekend piuttosto intenso! Che dire... contentissimo! Intanto mi sento di ringraziare <A title="" href="http://blogs.ugidotnet.org/rgm/" target="" name="">Gian Maria</A>, <A title="" href="http://blogs.ugidotnet.org/GisSharpBlog/" target="" name="">Diego</A>, <A title="" href="http://blogs.ugidotnet.org/ste8/" target="" name="">Stefano</A> e tutti gli altri ragazzi per la splendida organizzazione, per il caffé nel termos che mi ha salvato dal crollo, per i pasticcini che invece hanno salvato <A title="" href="http://blogs.ugidotnet.org/idamiani/" target="" name="">Igor</A> e soprattutto l'albero di natale aziendale, senza il quale io e <A title="" href="http://blogs.ugidotnet.org/janky" target="" name="">Janky</A> non avremmo potuto sistemare le ultime robine sulle slide durante la sessione di <A title="" href="http://www.codeclimber.net.nz/" target="" name="">Simone</A> (già... perché da che mondo&nbsp;è mondo, le slide e le demo devono essere completate 30 secondi prima di parlare, altrimenti porta sfiga).</P> <P>Mi spiace di essere andato un po' lungo ed aver sottratto un po' di tempo a Giancarlo, probabilmente non mi aspettavo tutte quelle domande e quindi il timing che avevo programmato è un po' andato a farsi friggere. Mi dispiace anche per la mancanza delle pallavoliste, se ci sarà mai occasione di replicare, giuro che io e janky faremo di tutto per portare una biondona in carne ed ossa! (azz... oramai l'ho detto!!)</P> <P>Però ragazzi, lasciatemelo dire... la cena! CHE CENA!! Quei ravioli al tartufo *spettacolari* e una compagnia che definire cordiale e divertente è dire poco! Peccato solo non esserci intrufolati al festino nell'altra sala <IMG height=19 src="http://www.imhoproject.org/files/risate.gif" width=19 align=absMiddle border=0></P> <P><A title="" href="http://blogs.ugidotnet.org/GisSharpBlog/archive/2006/12/16/59775.aspx" target="" name="">Ho letto</A> sul blog di Diego che è rimasto un po' deluso dalla presenza di pochi marchigiani. Beh, personalmente invece sono molto soddisfatto dell'afflusso di persone e il fatto che un evento così "in piccolo" abbia attirato gente da Arezzo, Bari, Brescia, vi deve rendere solo orgogliosi ragazzi! Continuate così. <IMG height=19 src="http://www.imhoproject.org/files/occhiolino.gif" width=19 align=absMiddle border=0></P> </FONT> <FONT face=Verdana size=2><P><A href="http://imhoproject.org/"><FONT face=Verdana size=1>powered by IMHO 1.3</FONT></A></P></FONT><!-- Powered by IMHO 1.3 (IT) Instant Blogger Copyright (c) 2005 A.Boschin - http://www.imhoproject.org --> <img src="http://blogs.ugidotnet.org/crad/aggbug/60029.aspx" width="1" height="1" /> Marco De Sanctis http://blogs.ugidotnet.org/crad/archive/2006/12/18/60029.aspx Mon, 18 Dec 2006 13:01:00 GMT http://blogs.ugidotnet.org/crad/archive/2006/12/18/60029.aspx#feedback 1 http://blogs.ugidotnet.org/crad/comments/commentRss/60029.aspx