<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>NHibernate</title>
        <link>http://blogs.ugidotnet.org/DanBlog/category/NHibernate.aspx</link>
        <description>NHibernate</description>
        <language>it-IT</language>
        <copyright>Daniele Armanasco</copyright>
        <generator>Subtext Version 2.6.0.0</generator>
        <item>
            <title>NHibernate e i trigger di SQL Server</title>
            <link>http://blogs.ugidotnet.org/DanBlog/archive/2007/11/15/89701.aspx</link>
            <description>Tentando di aggiornare una entità persistita su una tabella di SQL Server dove è presente un trigger ottengo l'eccezione seguente e l'aggiornamento fallisce:
[NHibernate.AdoNet.TooManyRowsAffectedException] {"Unexpected row count: 2; expected: 1"} NHibernate.AdoNet.TooManyRowsAffectedException
A quanto pare il fatto che il trigger aggiorni un altro record fa sì che il db ritorni 2 come numero di record aggiornati, il che fa pensare ad NH che ci sia stato un errore. Non ho trovato opzioni che dicano a NH di non verificare il numero di record aggiornati; sembra che l'unica soluzione consista nel disabilitare il conteggio dei record modificati nel trigger (impostare SET NOCOUNT ON prima del comando di UPDATE nel trigger e impostare SET NOCOUNT OFF dopo il comando di UPDATE). Non ho trovato altre soluzioni.&lt;img src="http://blogs.ugidotnet.org/DanBlog/aggbug/89701.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Daniele Armanasco</dc:creator>
            <guid>http://blogs.ugidotnet.org/DanBlog/archive/2007/11/15/89701.aspx</guid>
            <pubDate>Thu, 15 Nov 2007 00:35:12 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/DanBlog/archive/2007/11/15/89701.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/DanBlog/comments/commentRss/89701.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/DanBlog/services/trackbacks/89701.aspx</trackback:ping>
        </item>
        <item>
            <title>NUnit + NHibernate</title>
            <link>http://blogs.ugidotnet.org/DanBlog/archive/2007/08/16/87832.aspx</link>
            <description>Per testare in NUnit i metodi di persistenza (direttamente in Persistence o tramite provider e manager), siccome normalmente la classe SessionHelper carica la configurazione di NH leggendo dall'assembly in esecuzione, e siccome usando la gui di NUnit l'assembly in esecuzione è quello del progetto NUnit,
è necessario aggiungere al progetto di test un file di configurazione che sarà nella stessa directory del progetto NUnit collegato e che conterrà la configurazione per NH; nel progetto NUnit selezionare Project - Edit - Configurazione - File Name e indicare il nome del file di configurazione appena creato.&lt;img src="http://blogs.ugidotnet.org/DanBlog/aggbug/87832.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Daniele Armanasco</dc:creator>
            <guid>http://blogs.ugidotnet.org/DanBlog/archive/2007/08/16/87832.aspx</guid>
            <pubDate>Thu, 16 Aug 2007 02:42:04 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/DanBlog/archive/2007/08/16/87832.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/DanBlog/comments/commentRss/87832.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/DanBlog/services/trackbacks/87832.aspx</trackback:ping>
        </item>
        <item>
            <title>NHibernate quick start</title>
            <link>http://blogs.ugidotnet.org/DanBlog/archive/2007/08/16/87831.aspx</link>
            <description>- installare, se necessario, NH
- aggiungere il progetto Persistence alla solution
- aggiungere a Persistence il riferimento a NHibernate.dll e ai progetti della solution necessari (BusinessObjetcts, ...)
- aggiungere al file di configurazione del progetto che verrà avviato la sezione per NH:
&amp;lt;configSections&amp;gt; 
&amp;lt;section name="nhibernate" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /&amp;gt; 
&amp;lt;/configSections&amp;gt; 
&amp;lt;nhibernate&amp;gt; 
&amp;lt;add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider" /&amp;gt; 
&amp;lt;add key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver" /&amp;gt; 
&amp;lt;add key="hibernate.dialect" value="NHibernate.Dialect.MsSql2005Dialect" /&amp;gt; 
&amp;lt;add key="hibernate.connection.connection_string" value="Server=localhost; Integrated Security=SSPI; Database=ComLog;" /&amp;gt; 
&amp;lt;add key="hibernate.default_schema" value="dbo" /&amp;gt; 

&amp;lt;!-- General --&amp;gt; 
&amp;lt;add key="hibernate.use_proxy_validator" value="true"/&amp;gt; 

&amp;lt;!-- SQL Generation --&amp;gt; 
&amp;lt;add key="hibernate.max_fetch_depth" value="2"/&amp;gt; 
&amp;lt;add key="hibernate.show_sql" value="false"/&amp;gt; 

&amp;lt;add key="hibernate.connection.release_mode" value="on_close" /&amp;gt; 


&amp;lt;!-- Reflection Optimizer: null | lcg | codedom --&amp;gt; 
&amp;lt;add key="hibernate.use_reflection_optimizer" value="true"/&amp;gt; 
&amp;lt;add key="hibernate.bytecode.provider" value="lcg"/&amp;gt; 

&amp;lt;/nhibernate&amp;gt;
- aggiungere a Persistence la classe SessionHelper, che si occuperà di istanziare le sessioni dalla factory
Esempio:
using System.Reflection; 
using NHibernate; 
using NHibernate.Cfg; 

namespace Persistence 
{ 
public class SessionHelper 
{ 
private static ISessionFactory factory; 

static SessionHelper() 
{ 
Configuration cfg = new Configuration(); 
cfg.AddAssembly(Assembly.GetExecutingAssembly()); 
factory = cfg.BuildSessionFactory(); 
} 

public static ISession GetSession() 
{ 
return factory.OpenSession(); 
} 

public static ISession GetSession(IInterceptor interceptor) 
{ 
return factory.OpenSession(interceptor); 
}
- aggiungere i file di mapping di NH col nome classe.hbm.xml; esempio:
&amp;lt;?xml version="1.0" encoding="utf-8" ?&amp;gt; 
&amp;lt;hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
assembly="BusinnessObjects" 
namespace="BusinnessObjects"&amp;gt; 
&amp;lt;class name="Group" table="Groups" lazy="false"&amp;gt; 
&amp;lt;id name="Id"&amp;gt; 
&amp;lt;generator class="guid" /&amp;gt; 
&amp;lt;/id&amp;gt; 
&amp;lt;property name ="Name" /&amp;gt; 

&amp;lt;/class&amp;gt; 
&amp;lt;/hibernate-mapping&amp;gt;
- ricordati di impostare i file di mapping come Embedded Resource
A questo punto è possibile usare la session per salvare/caricare oggetti:
ISession session = SessionHelper.GetSession(); 
using (session) 
{ 
Group group = new Group(); 
group.Name = "gruppo test"; 
group.Id = new Guid(); 
session.SaveOrUpdate(group); 
session.Flush();
}
Per migliorare l'architettura aggiungere provider e manager:
- aggiungere a Persistence la classe generica del ProviderNH; ad esempio:
using System; 
using System.Collections.Generic; 
using System.Reflection; 
using NHibernate; 
using NHibernate.Transform; 

namespace Persistence 
{ 
public class NHibernateProvider&amp;lt;T&amp;gt; : IDisposable 
{ 
private ISession _session; 
//public event EventHandler&amp;lt;BeforeCommitEventArgs&amp;gt; BeforeCommit; 

protected ISession Session 
{ 
get { return _session; } 
set { _session = value; } 
} 

public NHibernateProvider() 
{ 
Session = SessionHelper.GetSession(); 
} 


public T LoadById(Int32 id) 
{ 
return Session.Load&amp;lt;T&amp;gt;(id); 
} 

public T LoadById(String id) 
{ 
return Session.Load&amp;lt;T&amp;gt;(id); 
} 

public IList&amp;lt;T&amp;gt; LoadAll() 
{ 
return LoadAll(String.Empty, true); 
} 

public IList&amp;lt;T&amp;gt; LoadAll(String associationPath, Boolean lazy) 
{ 
ICriteria criteria = Session.CreateCriteria(typeof(T)); 
if (lazy) 
{ 
return criteria.List&amp;lt;T&amp;gt;(); 
} 
else 
{ 
return criteria.SetFetchMode(associationPath, FetchMode.Join) 
.SetResultTransformer(new DistinctRootEntityResultTransformer()).List&amp;lt;T&amp;gt;(); 
} 
} 


public IList&amp;lt;T&amp;gt; LoadBy(String hql) 
{ 
return Session.CreateQuery(hql).List&amp;lt;T&amp;gt;(); 
} 

public void Save(T value) 
{ 
ITransaction tx = Session.BeginTransaction(); 
Session.SaveOrUpdate(value); 

//OnBeforeCommit(value); 

try 
{ 
tx.Commit(); // Fa commit e flush 
} 
catch (Exception ex) 
{ 
tx.Rollback(); 
//Logger.Error(this, MethodInfo.GetCurrentMethod().Name, ex); 
throw; 
} 
} 

public void SaveNew(T value) 
{ 
ITransaction tx = Session.BeginTransaction(); 
Session.Save(value); 

//OnBeforeCommit(value); 

try 
{ 
tx.Commit(); // Fa commit e flush 
} 
catch (Exception ex) 
{ 
tx.Rollback(); 
//Logger.Error(this, MethodInfo.GetCurrentMethod().Name, ex); 
throw; 
} 
} 

//private void OnBeforeCommit(T value) 
//{ 
// if (BeforeCommit != null) 
// BeforeCommit(this, new BeforeCommitEventArgs(value)); 
//} 


public void Delete(T value) 
{ 
Session.Delete(value); 
Session.Flush(); 
} 


public void Dispose() 
{ 
Session.Close(); 
Session.Dispose(); 
} 
} 
}
- aggiungere i provider specifici per i vari business objects
- aggiungere i manager che utilizzano i provider specifici&lt;img src="http://blogs.ugidotnet.org/DanBlog/aggbug/87831.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Daniele Armanasco</dc:creator>
            <guid>http://blogs.ugidotnet.org/DanBlog/archive/2007/08/16/87831.aspx</guid>
            <pubDate>Thu, 16 Aug 2007 02:37:21 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/DanBlog/archive/2007/08/16/87831.aspx#feedback</comments>
            <slash:comments>1629</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/DanBlog/comments/commentRss/87831.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/DanBlog/services/trackbacks/87831.aspx</trackback:ping>
        </item>
        <item>
            <title>NHibernate - file di configurazione</title>
            <link>http://blogs.ugidotnet.org/DanBlog/archive/2007/07/18/86081.aspx</link>
            <description>Situazione: 
i file di mapping e le classi helper di NH stannno nel progetto Persistence a cui il progetto Web ed altri progetti fanno riferimento. Essendo diversi i progetti che utilizzano Persistence non si vuole duplicare la configurazione di NH per ognuno di essi, per cui si è deciso di non inserirla nel web.config ma in un file di configurazione presente in Persistence.
Pb1: il file di configurazione, normalmente, non segue il file assembly (che in fase di compilazione viene copiato nella directory del progetto "chiamante").
Soluzione: imposto Copy to output directory = copy always per il file di configurazione.
 
Pb2: la sessionFactory deve essere creata leggendo la configurazione da un file diverso da web.config.
Quasi-soluzione1: è possibile specificare un nome arbitrario di file da cui la session factory deve attingere la configurazione così:
sessionFactory = new Configuration().Configure("C:\\...path...\\nhibernate.config").BuildSessionFactory();
Pb: se utilizzo un percorso relativo cerca il file in System32 e non nella cartella di Output. Soluzione?
Soluzione2: chiamo il file di configurazione con il nome standard gestito da NH, cioè hibernate.cfg.xml; in questo caso il file viene cercato nella cartella di output e il tutto funziona.&lt;img src="http://blogs.ugidotnet.org/DanBlog/aggbug/86081.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Daniele Armanasco</dc:creator>
            <guid>http://blogs.ugidotnet.org/DanBlog/archive/2007/07/18/86081.aspx</guid>
            <pubDate>Wed, 18 Jul 2007 15:51:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/DanBlog/archive/2007/07/18/86081.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/DanBlog/comments/commentRss/86081.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/DanBlog/services/trackbacks/86081.aspx</trackback:ping>
        </item>
        <item>
            <title>NHibernate: formattare le date in HQL</title>
            <link>http://blogs.ugidotnet.org/DanBlog/archive/2007/05/18/78519.aspx</link>
            <description>Il formato più conveniente è:

day.ToString(
"yyyy/MM/dd");&lt;img src="http://blogs.ugidotnet.org/DanBlog/aggbug/78519.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Daniele Armanasco</dc:creator>
            <guid>http://blogs.ugidotnet.org/DanBlog/archive/2007/05/18/78519.aspx</guid>
            <pubDate>Fri, 18 May 2007 01:03:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/DanBlog/archive/2007/05/18/78519.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/DanBlog/comments/commentRss/78519.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/DanBlog/services/trackbacks/78519.aspx</trackback:ping>
        </item>
        <item>
            <title>NHibernate: eccezione "a different object with the same identifier value was already associated with the session" - SaveOrUpdateCopy</title>
            <link>http://blogs.ugidotnet.org/DanBlog/archive/2007/04/23/76267.aspx</link>
            <description>Non ho ancora avuto il tempo di comprendere a fondo la questione, però quando utilizzavo SaveOrUpdate per aggiornare un oggetto già oggetto dello stesso metodo un paio di volte, ottenevo l'eccezione indicata e il record nel db non veniva aggiornata con il Flush successivo. Usando invece SaveOrUpdateCopy, se l'oggetto è già presente nel contesto di persistenza, non viene generata l'eccezione ma viene aggiornato l'oggetto presente (ciò che io pensavo facesse SaveOrUpdate; a questo punto cosa fa SaveOrUpdate? E Update?)&lt;img src="http://blogs.ugidotnet.org/DanBlog/aggbug/76267.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Daniele Armanasco</dc:creator>
            <guid>http://blogs.ugidotnet.org/DanBlog/archive/2007/04/23/76267.aspx</guid>
            <pubDate>Mon, 23 Apr 2007 01:39:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/DanBlog/archive/2007/04/23/76267.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/DanBlog/comments/commentRss/76267.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/DanBlog/services/trackbacks/76267.aspx</trackback:ping>
        </item>
    </channel>
</rss>