<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://dotnetmarche.org/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Search results matching tags 'NHibernate' and 'ASP.Net'</title><link>http://dotnetmarche.org/search/SearchResults.aspx?o=DateDescending&amp;tag=NHibernate,ASP.Net&amp;orTags=0</link><description>Search results matching tags 'NHibernate' and 'ASP.Net'</description><dc:language>en-US</dc:language><generator>CommunityServer 2007.1 (Build: 20917.1142)</generator><item><title>Ricomincio da 3...</title><link>http://dotnetmarche.org/blogs/andreabalducci/archive/2008/06/14/ricomincio-da-3.aspx</link><pubDate>Sat, 14 Jun 2008 17:15:54 GMT</pubDate><guid isPermaLink="false">61321887-5500-4417-8b9e-633d632ef265:3759</guid><dc:creator>andrea.balducci</dc:creator><description>&lt;p align="justify"&gt;Stavo testando la beta 3 di ASP.Net MVC con Spring Framework e NHibernate. Alla prima richiesta processata da IIS è uscito un errore generico (&amp;quot;Server Application Unavailable&amp;quot;) che rimanda all&amp;#39;event viewer.&lt;/p&gt; &lt;p align="justify"&gt;L&amp;#39;event viewer mostra:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;div align="justify"&gt;Event Type:&amp;nbsp;&amp;nbsp;&amp;nbsp; Error&lt;br /&gt;Event Source:&amp;nbsp;&amp;nbsp;&amp;nbsp; ASP.NET 2.0.50727.0&lt;br /&gt;Event ID:&amp;nbsp;&amp;nbsp;&amp;nbsp; 1000&lt;br /&gt;Description:&lt;br /&gt;aspnet_wp.exe&amp;nbsp; (PID: 1328) stopped unexpectedly. &lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align="justify"&gt;Event Type:&amp;nbsp;&amp;nbsp;&amp;nbsp; Error&lt;br /&gt;Event Source:&amp;nbsp;&amp;nbsp;&amp;nbsp; ASP.NET 2.0.50727.0&lt;br /&gt;Event ID:&amp;nbsp;&amp;nbsp;&amp;nbsp; 1089&lt;br /&gt;Description:&lt;br /&gt;Failed to execute the request because the ASP.NET process identity does not have read permissions to the global assembly cache. Error: 0x80070005 Access is denied.&amp;nbsp; &lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align="justify"&gt;Event Type:&amp;nbsp;&amp;nbsp;&amp;nbsp; Error&lt;br /&gt;Event Source:&amp;nbsp;&amp;nbsp;&amp;nbsp; ASP.NET 2.0.50727.0&lt;br /&gt;Event ID:&amp;nbsp;&amp;nbsp;&amp;nbsp; 1334&lt;br /&gt;Description:&lt;br /&gt;&lt;font color="#ff0000"&gt;Failed to initialize the AppDomain:/LM/W3SVC/1/Root/nw &lt;br /&gt;&lt;/font&gt;Exception: System.IO.FileLoadException &lt;br /&gt;Message: Could not load file or assembly &amp;#39;System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a&amp;#39; or one of its dependencies. Access is denied. &lt;br /&gt;StackTrace:&amp;nbsp;&amp;nbsp;&amp;nbsp; at System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark&amp;amp; stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)&lt;br /&gt;&amp;nbsp;&amp;nbsp; at System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark&amp;amp; stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)&lt;br /&gt;&amp;nbsp;&amp;nbsp; at System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark&amp;amp; stackMark, Boolean forIntrospection)&lt;br /&gt;&amp;nbsp;&amp;nbsp; at System.Reflection.Assembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark&amp;amp; stackMark, Boolean forIntrospection)&lt;br /&gt;&amp;nbsp;&amp;nbsp; at System.Activator.CreateInstance(String assemblyName, String typeName, Boolean ignoreCase, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes, Evidence securityInfo, StackCrawlMark&amp;amp; stackMark)&lt;br /&gt;&amp;nbsp;&amp;nbsp; at System.Activator.CreateInstance(String assemblyName, String typeName)&lt;br /&gt;&amp;nbsp;&amp;nbsp; at System.AppDomain.CreateInstance(String assemblyName, String typeName)&lt;br /&gt;&amp;nbsp;&amp;nbsp; at System.AppDomain.CreateInstance(String assemblyName, String typeName)&lt;br /&gt;&amp;nbsp;&amp;nbsp; at System.Web.Hosting.ApplicationManager.CreateAppDomainWithHostingEnvironment(String appId, IApplicationHost appHost, HostingEnvironmentParameters hostingParameters)&lt;br /&gt;&amp;nbsp;&amp;nbsp; at System.Web.Hosting.ApplicationManager.CreateAppDomainWithHostingEnvironmentAndReportErrors(String appId, IApplicationHost appHost, HostingEnvironmentParameters hostingParameters) &lt;/div&gt;&lt;/li&gt;&lt;/ol&gt; &lt;p align="justify"&gt;Provo con l&amp;#39;ASP.Net Development Server direttamente da VS 2008 e funziona tutto ok....&lt;/p&gt; &lt;p align="justify"&gt;Scatta la ricerca su google, escono tonellate di pagine che spiegano come cambiare i permessi alla GAC, reinstallare VS e IIS nell&amp;#39;ordine corretto e via di seguito (ho letto veramente di tutto!!!).&lt;/p&gt; &lt;p align="justify"&gt;Tra le decine di soluzioni &amp;quot;strambe&amp;quot; (e lunghissime) appare un commento semplice semplice che recita &amp;quot;You need to give the account ASPNET read access to the web site&amp;#39;s application directory.&amp;quot;&lt;/p&gt; &lt;p align="justify"&gt;Tana: scoppattando lo zip con i sorgenti non ho l&amp;#39;ACL con i permessi corretti. Aggiunto ASP.Net tra gli utenti abilitati e anche la virtual folder su IIS va.&lt;br /&gt;&lt;/p&gt;&lt;strong&gt;&lt;/strong&gt; &lt;p align="justify"&gt;&lt;strong&gt;Morale&lt;br /&gt;&lt;/strong&gt;Quando si cerca di identificare un problema &lt;u&gt;bisogna sempre risalire al primo&lt;/u&gt; errore, tutti gli altri scaturiti in cascata sono solo fuorvianti. La maggior parte dei post che&amp;nbsp; ho trovato focalizzavano l&amp;#39;attenzione sul permettere all&amp;#39;utente ASP.Net di accedere alla GAC, dando per scontato l&amp;#39;esistenza dell&amp;#39;application domain. Nel mio caso l&amp;#39;assenza dei permessi sulla root del progetto web impediva la creazione di un application domain, quindi non esistevano credenziali valide per accedere alla GAC.&lt;/p&gt; &lt;p align="justify"&gt;Usando &amp;quot;Asp.Net Development Server&amp;quot; tutto gira con le credenziali dell&amp;#39;utente corrente quindi tutto fila liscio...&lt;/p&gt; &lt;p align="justify"&gt;Spero possa esservi di aiuto.&lt;/p&gt;</description></item><item><title>NHibernate, Lazy, Sessioni e Cache</title><link>http://dotnetmarche.org/blogs/andreabalducci/archive/2008/01/13/nhibernate-lazy-sessioni-e-cache.aspx</link><pubDate>Sun, 13 Jan 2008 12:26:55 GMT</pubDate><guid isPermaLink="false">61321887-5500-4417-8b9e-633d632ef265:3340</guid><dc:creator>andrea.balducci</dc:creator><description>&lt;p&gt;&lt;/p&gt; &lt;p&gt;Appunto di viaggio: applicazione Asp.Net con AjaxToolkit ed NHibernate 1.2. Il domain model è mappato in modalità lazy per massimizzare le performance.&lt;/p&gt; &lt;p&gt;Il lato presentation dell&amp;#39;applicativo fa uso intensivo di UpdatePanel che al bisogno completano l&amp;#39;interfaccia&amp;nbsp; utente con delle chiamate in background; per gestire le chiamate asincrone l&amp;#39;entity principale del documento resta in session e viene riagganciata alla session (&lt;em&gt;&lt;a href="http://www.hibernate.org/42.html" target="_blank"&gt;session-per-request&lt;/a&gt; in un modulo http&lt;/em&gt;) per fare in modo che i proxy creati per la gestione delle entity lazy possano funzionare correttamente.&lt;/p&gt; &lt;p&gt;Tutto fila liscio finchè non mi accorgo che in caso di edit di una entity, alcune proprietà non vengono salvate su db. Le provo tutte fino a che (disperato) scarico i sorgenti di NHibernate, compilata nuova e inizio il debug per capire dove sta l&amp;#39;inghippo.&lt;/p&gt; &lt;p&gt;Il problema è proprio nel fatto di riassociare l&amp;#39;entity alla session di pagina (page_load) che&amp;nbsp; poi verrà usata per fare anche la transazione di salvataggio; il fatto di riassociare l&amp;#39;entity alla session con ISession.Lock(entity, LockMode.none) causa l&amp;#39;inserimento nella cache di sessione dello stato ATTUALE dell&amp;#39;entity (che è in session) falsando il controllo di dirty check che esegue NHibernate per decidere se e cosa aggiornare sul db. &lt;/p&gt; &lt;p&gt;PANICO!!!!&lt;/p&gt; &lt;p&gt;Lavoro da consegnare e una tonnellata di entity da dover fixare... Due ore su google per cercare soluzioni ma non ne trovo nessuna indolore.&lt;br /&gt;Provo con un interceptor, ma il check di dirty si basa comunque sullo stato al momento della reattach alla session e quindi niente; provo a vedere se vale la pena di scrivermi un persister custom ma a naso non mi garantisce il risultato..... mumble.. mumble... &lt;/p&gt; &lt;p&gt;IDEA!&lt;/p&gt; &lt;p&gt;Visto che voglio forzare il salvataggio indipendentemente dallo stato della cache la soluzione più immediata è quella di un bel Session.Evict(entity) prima di fare la SaveOrUpdate(entity).&lt;/p&gt; &lt;p&gt;Risultato: 0 mapping modificati, 0 dataentry modificati, 1 riga di codice in più sul gestore del salvataggio nella classe base da cui derivano tutte le form. Soluzione poco elegante ma di impatto zero. Per stavolta è andata bene :D&lt;/p&gt;</description></item><item><title>UI.Comfort</title><link>http://dotnetmarche.org/blogs/andreabalducci/archive/2007/11/29/ui-comfort.aspx</link><pubDate>Thu, 29 Nov 2007 14:54:18 GMT</pubDate><guid isPermaLink="false">61321887-5500-4417-8b9e-633d632ef265:3200</guid><dc:creator>andrea.balducci</dc:creator><description>&lt;p&gt;&lt;a href="http://www.prxm.it/proximoweb/Portals/0/img/products/CMMS-IT/Generazione-Campagna.png%20" target="_blank"&gt;&lt;img style="margin:2px 4px 2px 2px;" height="232" src="http://www.prxm.it/proximoweb/Portals/0/img/products/CMMS-IT/Generazione-Campagna.png" width="240" align="left" alt="" /&gt;&lt;/a&gt; Mi capita spesso di vedere ottimi software penalizzati da una interfaccia utente carente che rende di fatto macchinosa e ostica la fruizione da parte dell&amp;#39;utente finale. Magari la colpa è della fretta nel voler consegnare un progetto o perchè l&amp;#39;importante per chi sviluppa è &amp;quot;quello sotto il cofano&amp;quot;, l&amp;#39;algoritmo ultra-ottimizzato che ci rende orgogliosi ma che l&amp;#39;utente non capirà mai. Molte volte per vendere una soluzione basta proporre all&amp;#39;utente i dati in modo semplice e chiaro, una interfaccia curata che dia subito una buona impressione e che metta a suo agio chi deve usare il nostro software, anche se per estrarre i dati ci vuole un secondo di più. Ad esempio ogni volta che faccio vedere questo screenshot ad un cliente la risposta è &amp;quot;eccolo.... cercavo proprio questo&amp;quot;.&lt;/p&gt;</description></item><item><title>Mapping di un booleano su un campo stringa con NHibernate</title><link>http://dotnetmarche.org/blogs/andreabalducci/archive/2007/06/11/mapping-di-un-booleano-su-un-campo-stringa-con-nhibernate.aspx</link><pubDate>Mon, 11 Jun 2007 13:45:00 GMT</pubDate><guid isPermaLink="false">61321887-5500-4417-8b9e-633d632ef265:2150</guid><dc:creator>andrea.balducci</dc:creator><description>&lt;p&gt;Ho dovuto integrare un database legacy con una nuova applicazione basata su NHibernate. Nel mio caso mi sono trovato che nella base dati i campi bool vengono memorizzati come char(1) rispettivamente &amp;#39;0&amp;#39; e &amp;#39;1&amp;#39;. Per mapparli correttamente su NHibernate è bastato creare uno usertype e modificare il mapping sul file .hbm.xml&lt;/p&gt;
&lt;p&gt;Ecco il codice del nuovo tipo booleano (pescato sul web ed aggiornato a NHibernate 1.2)&lt;/p&gt;
&lt;p&gt;&lt;textarea class="c#" name="code" rows="20" cols="60"&gt;using System;
using System.Collections.Generic;
using System.Text;
using NHibernate;
using System.Data;
using NHibernate.UserTypes;
using NHibernate.SqlTypes;

namespace Prxm.Framework.Data.NHibernate.UserTypes
{
    public class TBBooleanType : IUserType 
    {
        #region IUserType Members
        public object DeepCopy(object value)
        {
            return value;
        }

        public int GetHashCode(object x)
        {
            return x.GetHashCode();
        }

        public bool IsMutable
        {
            get { return false; }
        }

        public object NullSafeGet(IDataReader rs, string[] names, object owner)
        {
            string name = names[0];
            return rs[ name ].Equals(&amp;quot;1&amp;quot;);
        }

        public void NullSafeSet(IDbCommand cmd, object value, int index)
        {
            string db_value = (value.Equals(true)) ? &amp;quot;1&amp;quot; : &amp;quot;0&amp;quot;;
            IDbDataParameter parameter = (IDbDataParameter)cmd.Parameters[index];
            parameter.Value = db_value;            
        }

        public Type ReturnedType
        {
            get { return typeof(bool); }
        }

        public SqlType[] SqlTypes
        {
            get { return new SqlType[] { new SqlType(DbType.AnsiStringFixedLength, 1) }; }
        }

        bool IUserType.Equals(object x, object y)
        {
            return x.Equals(y);
        }

        //
        // Summary:
        //     During merge, replace the existing (target) value in the entity we are merging
        //     to with a new (original) value from the detached entity we are merging. For
        //     immutable objects, or null values, it is safe to simply return the first
        //     parameter. For mutable objects, it is safe to return a copy of the first
        //     parameter. For objects with component values, it might make sense to recursively
        //     replace component values.
        //
        // Parameters:
        //   original:
        //     the value from the detached entity being merged
        //
        //   target:
        //     the value in the managed entity
        //
        //   owner:
        //     the managed entity
        //
        // Returns:
        //     the value to be merged
        public object Replace(object original, object target, object owner)
        {
            return DeepCopy(original);        
        }

        #endregion

        #region IUserType Members

        public object Assemble(object cached, object owner)
        {
            return DeepCopy(cached);
        }

        public object Disassemble(object value)
        {
            return DeepCopy(value);
        }

        #endregion
    }
}

&lt;/textarea&gt; &lt;/p&gt;
&lt;p&gt;Nel file di mapping è&amp;nbsp;necessario indicare il corretto tipo&lt;/p&gt;
&lt;p&gt;&amp;lt;property&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name=&amp;quot;Processed&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; column=&amp;quot;Processed&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type=&amp;quot;Prxm.Framework.Data.NHibernate.UserTypes.TBBooleanType, Prxm.Framework.Data&amp;quot; /&amp;gt;&lt;/p&gt;</description></item><item><title>James is out!</title><link>http://dotnetmarche.org/blogs/andreabalducci/archive/2007/06/05/james-is-out.aspx</link><pubDate>Tue, 05 Jun 2007 03:05:00 GMT</pubDate><guid isPermaLink="false">61321887-5500-4417-8b9e-633d632ef265:2046</guid><dc:creator>andrea.balducci</dc:creator><description>&lt;p&gt;&lt;img title="James logo" style="WIDTH:150px;HEIGHT:50px;" height="50" alt="James logo" hspace="4" src="http://www.prxm.it/proximoweb/Portals/0/img/products/James/james-logo-150-white.png" width="150" align="left" border="0" /&gt;Rilasciato ufficialmente &lt;a class="" href="http://www.prxm.it/proximoweb/Prodotti/JamesControlloProduzione/tabid/85/Default.aspx" target="_blank"&gt;JAMES&lt;/a&gt; (&lt;span class="Head" id="dnn_ctr433_dnnTITLE_lblTitle"&gt;Job Analysis for Manufacturing Execution Systems).&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="Head"&gt;Ultima fatica che ha permesso di mettere a frutto le tecnologie di cui abbiamo spesso parlato: NHibernate, Ajax, Windsor Container etc....&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="Head"&gt;Il web 2.0 entra negli ambienti di produzione con una applicazione &lt;a class="" href="http://en.wikipedia.org/wiki/Kiosk_software"&gt;Kiosk&amp;nbsp;&lt;/a&gt;e cerca di scalzare via quelle inguardabili maschere grigie che sono tutto fuorchè user-friendly (e poi ci si chiede come mai i dati rilevati sono spesso errati!).&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="Head"&gt;Un grazie a tutta la community per l&amp;#39;opera divulgativa (che ha dato i suoi frutti) e un arrivederci al prossimo Workshop.&lt;/span&gt;&lt;/p&gt;</description></item><item><title>NHibernate Best Practices</title><link>http://dotnetmarche.org/blogs/andreabalducci/archive/2007/06/04/nhibernate-best-practices.aspx</link><pubDate>Mon, 04 Jun 2007 01:41:00 GMT</pubDate><guid isPermaLink="false">61321887-5500-4417-8b9e-633d632ef265:2040</guid><dc:creator>andrea.balducci</dc:creator><description>&lt;p&gt;Se ne parlava alla cena, quindi pubblico il link all&amp;#39;articolo su CodeProject relativo allo sviluppo di applicazioni ASP.Net con l&amp;#39;integrazione di NHibernate e IoC.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.codeproject.com/aspnet/NHibernateBestPractices.asp" title="NHibernate Best Practices with ASP.NET, 1.2nd Ed." target="_blank"&gt;http://www.codeproject.com/aspnet/NHibernateBestPractices.asp&amp;nbsp;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;L&amp;#39;articolo è molto interessante e l&amp;#39;esempio Enterprise può essere usato come punto di partenza per la realizzazione di applicazioni.&lt;br /&gt;&lt;/p&gt;</description></item></channel></rss>