<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>&lt;p&gt;&lt;font face="Arial"&gt;Tentando di aggiornare una entità persistita su una tabella di SQL Server dove è presente un trigger ottengo l'eccezione seguente e l'aggiornamento fallisce:&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;[NHibernate.AdoNet.TooManyRowsAffectedException] {"Unexpected row count: 2; expected: 1"} NHibernate.AdoNet.TooManyRowsAffectedException&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;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&lt;font face="Arial"&gt; 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;/font&gt;&lt;/p&gt;&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>&lt;p&gt;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,&lt;/p&gt;
&lt;p&gt;è 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;/p&gt;&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>&lt;p&gt;- installare, se necessario, NH&lt;/p&gt;
&lt;p&gt;- aggiungere il progetto Persistence alla solution&lt;/p&gt;
&lt;p&gt;- aggiungere a Persistence il riferimento a NHibernate.dll e ai progetti della solution necessari (BusinessObjetcts, ...)&lt;/p&gt;
&lt;p&gt;- aggiungere al file di configurazione del progetto che verrà avviato la sezione per NH:&lt;/p&gt;
&lt;p&gt;&amp;lt;configSections&amp;gt; &lt;br /&gt;
&amp;lt;section name="nhibernate" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /&amp;gt; &lt;br /&gt;
&amp;lt;/configSections&amp;gt; &lt;br /&gt;
&amp;lt;nhibernate&amp;gt; &lt;br /&gt;
&amp;lt;add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider" /&amp;gt; &lt;br /&gt;
&amp;lt;add key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver" /&amp;gt; &lt;br /&gt;
&amp;lt;add key="hibernate.dialect" value="NHibernate.Dialect.MsSql2005Dialect" /&amp;gt; &lt;br /&gt;
&amp;lt;add key="hibernate.connection.connection_string" value="Server=localhost; Integrated Security=SSPI; Database=ComLog;" /&amp;gt; &lt;br /&gt;
&amp;lt;add key="hibernate.default_schema" value="dbo" /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- General --&amp;gt; &lt;br /&gt;
&amp;lt;add key="hibernate.use_proxy_validator" value="true"/&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- SQL Generation --&amp;gt; &lt;br /&gt;
&amp;lt;add key="hibernate.max_fetch_depth" value="2"/&amp;gt; &lt;br /&gt;
&amp;lt;add key="hibernate.show_sql" value="false"/&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;add key="hibernate.connection.release_mode" value="on_close" /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Reflection Optimizer: null | lcg | codedom --&amp;gt; &lt;br /&gt;
&amp;lt;add key="hibernate.use_reflection_optimizer" value="true"/&amp;gt; &lt;br /&gt;
&amp;lt;add key="hibernate.bytecode.provider" value="lcg"/&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nhibernate&amp;gt;&lt;/p&gt;
&lt;p&gt;- aggiungere a Persistence la classe SessionHelper, che si occuperà di istanziare le sessioni dalla factory&lt;/p&gt;
&lt;p&gt;Esempio:&lt;/p&gt;
&lt;p&gt;using System.Reflection; &lt;br /&gt;
using NHibernate; &lt;br /&gt;
using NHibernate.Cfg; &lt;br /&gt;
&lt;br /&gt;
namespace Persistence &lt;br /&gt;
{ &lt;br /&gt;
public class SessionHelper &lt;br /&gt;
{ &lt;br /&gt;
private static ISessionFactory factory; &lt;br /&gt;
&lt;br /&gt;
static SessionHelper() &lt;br /&gt;
{ &lt;br /&gt;
Configuration cfg = new Configuration(); &lt;br /&gt;
cfg.AddAssembly(Assembly.GetExecutingAssembly()); &lt;br /&gt;
factory = cfg.BuildSessionFactory(); &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
public static ISession GetSession() &lt;br /&gt;
{ &lt;br /&gt;
return factory.OpenSession(); &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
public static ISession GetSession(IInterceptor interceptor) &lt;br /&gt;
{ &lt;br /&gt;
return factory.OpenSession(interceptor); &lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;- aggiungere i file di mapping di NH col nome classe.hbm.xml; esempio:&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&amp;lt;?xml version="1.0" encoding="utf-8" ?&amp;gt; &lt;br /&gt;
&amp;lt;hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" &lt;br /&gt;
assembly="BusinnessObjects" &lt;br /&gt;
namespace="BusinnessObjects"&amp;gt; &lt;br /&gt;
&amp;lt;class name="Group" table="Groups" lazy="false"&amp;gt; &lt;br /&gt;
&amp;lt;id name="Id"&amp;gt; &lt;br /&gt;
&amp;lt;generator class="guid" /&amp;gt; &lt;br /&gt;
&amp;lt;/id&amp;gt; &lt;br /&gt;
&amp;lt;property name ="Name" /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/class&amp;gt; &lt;br /&gt;
&amp;lt;/hibernate-mapping&amp;gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;- ricordati di impostare i file di mapping come Embedded Resource&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;A questo punto &lt;/font&gt;è possibile usare la session per salvare/caricare oggetti:&lt;/p&gt;
&lt;p&gt;ISession session = SessionHelper.GetSession(); &lt;br /&gt;
using (session) &lt;br /&gt;
{ &lt;br /&gt;
Group group = new Group(); &lt;br /&gt;
group.Name = "gruppo test"; &lt;br /&gt;
group.Id = new Guid(); &lt;br /&gt;
session.SaveOrUpdate(group); &lt;br /&gt;
session.Flush();&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;Per migliorare l'architettura aggiungere provider e manager:&lt;/p&gt;
&lt;p&gt;- aggiungere a Persistence la classe generica del ProviderNH; ad esempio:&lt;/p&gt;
&lt;p&gt;using System; &lt;br /&gt;
using System.Collections.Generic; &lt;br /&gt;
using System.Reflection; &lt;br /&gt;
using NHibernate; &lt;br /&gt;
using NHibernate.Transform; &lt;br /&gt;
&lt;br /&gt;
namespace Persistence &lt;br /&gt;
{ &lt;br /&gt;
public class NHibernateProvider&amp;lt;T&amp;gt; : IDisposable &lt;br /&gt;
{ &lt;br /&gt;
private ISession _session; &lt;br /&gt;
//public event EventHandler&amp;lt;BeforeCommitEventArgs&amp;gt; BeforeCommit; &lt;br /&gt;
&lt;br /&gt;
protected ISession Session &lt;br /&gt;
{ &lt;br /&gt;
get { return _session; } &lt;br /&gt;
set { _session = value; } &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
public NHibernateProvider() &lt;br /&gt;
{ &lt;br /&gt;
Session = SessionHelper.GetSession(); &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
public T LoadById(Int32 id) &lt;br /&gt;
{ &lt;br /&gt;
return Session.Load&amp;lt;T&amp;gt;(id); &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
public T LoadById(String id) &lt;br /&gt;
{ &lt;br /&gt;
return Session.Load&amp;lt;T&amp;gt;(id); &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
public IList&amp;lt;T&amp;gt; LoadAll() &lt;br /&gt;
{ &lt;br /&gt;
return LoadAll(String.Empty, true); &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
public IList&amp;lt;T&amp;gt; LoadAll(String associationPath, Boolean lazy) &lt;br /&gt;
{ &lt;br /&gt;
ICriteria criteria = Session.CreateCriteria(typeof(T)); &lt;br /&gt;
if (lazy) &lt;br /&gt;
{ &lt;br /&gt;
return criteria.List&amp;lt;T&amp;gt;(); &lt;br /&gt;
} &lt;br /&gt;
else &lt;br /&gt;
{ &lt;br /&gt;
return criteria.SetFetchMode(associationPath, FetchMode.Join) &lt;br /&gt;
.SetResultTransformer(new DistinctRootEntityResultTransformer()).List&amp;lt;T&amp;gt;(); &lt;br /&gt;
} &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
public IList&amp;lt;T&amp;gt; LoadBy(String hql) &lt;br /&gt;
{ &lt;br /&gt;
return Session.CreateQuery(hql).List&amp;lt;T&amp;gt;(); &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
public void Save(T value) &lt;br /&gt;
{ &lt;br /&gt;
ITransaction tx = Session.BeginTransaction(); &lt;br /&gt;
Session.SaveOrUpdate(value); &lt;br /&gt;
&lt;br /&gt;
//OnBeforeCommit(value); &lt;br /&gt;
&lt;br /&gt;
try &lt;br /&gt;
{ &lt;br /&gt;
tx.Commit(); // Fa commit e flush &lt;br /&gt;
} &lt;br /&gt;
catch (Exception ex) &lt;br /&gt;
{ &lt;br /&gt;
tx.Rollback(); &lt;br /&gt;
//Logger.Error(this, MethodInfo.GetCurrentMethod().Name, ex); &lt;br /&gt;
throw; &lt;br /&gt;
} &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
public void SaveNew(T value) &lt;br /&gt;
{ &lt;br /&gt;
ITransaction tx = Session.BeginTransaction(); &lt;br /&gt;
Session.Save(value); &lt;br /&gt;
&lt;br /&gt;
//OnBeforeCommit(value); &lt;br /&gt;
&lt;br /&gt;
try &lt;br /&gt;
{ &lt;br /&gt;
tx.Commit(); // Fa commit e flush &lt;br /&gt;
} &lt;br /&gt;
catch (Exception ex) &lt;br /&gt;
{ &lt;br /&gt;
tx.Rollback(); &lt;br /&gt;
//Logger.Error(this, MethodInfo.GetCurrentMethod().Name, ex); &lt;br /&gt;
throw; &lt;br /&gt;
} &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
//private void OnBeforeCommit(T value) &lt;br /&gt;
//{ &lt;br /&gt;
// if (BeforeCommit != null) &lt;br /&gt;
// BeforeCommit(this, new BeforeCommitEventArgs(value)); &lt;br /&gt;
//} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
public void Delete(T value) &lt;br /&gt;
{ &lt;br /&gt;
Session.Delete(value); &lt;br /&gt;
Session.Flush(); &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
public void Dispose() &lt;br /&gt;
{ &lt;br /&gt;
Session.Close(); &lt;br /&gt;
Session.Dispose(); &lt;br /&gt;
} &lt;br /&gt;
} &lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;- aggiungere i provider specifici per i vari business objects&lt;/p&gt;
&lt;p&gt;- aggiungere i manager che utilizzano i provider specifici&lt;/p&gt;&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>&lt;p&gt;Situazione: &lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Pb1: il file di configurazione, normalmente, non segue il file assembly (che in fase di compilazione viene copiato nella directory del progetto "chiamante").&lt;/p&gt;
&lt;p&gt;Soluzione: imposto Copy to output directory = copy always per il file di configurazione.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Pb2: la sessionFactory deve essere creata leggendo la configurazione da un file diverso da web.config.&lt;/p&gt;
&lt;p&gt;Quasi-soluzione1: è possibile specificare un nome arbitrario di file da cui la session factory deve attingere la configurazione così:&lt;/p&gt;
&lt;p&gt;sessionFactory = new Configuration().Configure("C:\\...path...\\nhibernate.config").BuildSessionFactory();&lt;/p&gt;
&lt;p&gt;Pb: se utilizzo un percorso relativo cerca il file in System32 e non nella cartella di Output. Soluzione?&lt;/p&gt;
&lt;p&gt;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;/p&gt;&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>&lt;p&gt;Il formato più conveniente è:&lt;/p&gt;
&lt;font size="2"&gt;
&lt;p&gt;day.ToString(&lt;/p&gt;
&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;"yyyy/MM/dd"&lt;/font&gt;&lt;font size="2"&gt;);&lt;/font&gt;&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>