<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/rgm/category/NHibernate.aspx</link>
        <description>NHibernate</description>
        <language>it-IT</language>
        <copyright>Gian Maria  Ricci</copyright>
        <generator>Subtext Version 2.6.0.0</generator>
        <item>
            <title>Evitate se possibile NHibernate not-found=&amp;rdquo;ignore&amp;rdquo;</title>
            <link>http://blogs.ugidotnet.org/rgm/archive/2013/06/19/evitate-se-possibile-nhibernate-not-foundrdquoignorerdquo.aspx</link>
            <description>&lt;p&gt;Se avete un legacy database dove alcuni processi fanno manipolazioni del database al di fuori del vostro controllo potreste trovarvi in una situazione in cui l’entità A referenzia l’entità B con una many-to-one, e quindi la tabella dove viene salvata l’entità A ha una foreign-key verso la tabella B.&lt;/p&gt;  &lt;p&gt;Supponiamo inoltre che la tabella A sia stata introdotta in un momento successivo, e ci sono processi che cancellano record dalla tabella usata per salvare l’entità B, lasciando quindi i record di A orfani. In questa situazione NHibernate genererà un errore a runtime quando si tenta di accedere alla relazione di una entità orfana, perchè il lazy load non riesce a caricare la corrispondente entità B, pur avendo un id nella colonna della foreign-key.&lt;/p&gt;  &lt;p&gt;Una possibile soluzione è utilizzare l’opzione not-found=”ignore”, la quale permette di dire a nhibernate di ignorare questa situazione, se nella tabella dell’entità A ci sta un riferimento ad una entità B che non è più presente, si può ignorare questo errore, e lasciare la corrispondente proprietà di navigazione a null.&lt;/p&gt;  &lt;p&gt;Questa però è una soluzione poco efficiente per molte ragioni. La prima è che NHibernate effettuerà sempre la query per tentare di recuperare l’entità B correlata, quindi ogni volta che caricate una entità A viene sempre fatta una ulteriore select per capire se la corrispondente Entità B esiste, quindi non viene più applicato il lazy load. Quando caricate liste di entità &lt;a href="http://www.niceideas.ch/roller2/badtrash/entry/hibernate_s_not_found_ignore" target="_blank"&gt;il problema potrebbe diventare anche peggiore&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;La soluzione in questo caso è una sola, fare in modo che il database non abbia foreign-key orfane, perchè avere una base dati di questo tipo è veramente molto pericoloso, quindi se avete dei processi fuori dal vostro controllo, non dimenticate la &lt;a href="http://msdn.microsoft.com/en-us/library/ms186973%28v=sql.105%29.aspx" target="_blank"&gt;ON DELETE SET NULL&lt;/a&gt;, che permette di mantenere l’integrità referenziale in maniera automatica, e quindi evitando di dover ricorrere a delle opzioni “pericolose” di NHibernate.&lt;/p&gt;  &lt;p&gt;Alk.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/rgm/aggbug/101588.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Gian Maria  Ricci</dc:creator>
            <guid>http://blogs.ugidotnet.org/rgm/archive/2013/06/19/evitate-se-possibile-nhibernate-not-foundrdquoignorerdquo.aspx</guid>
            <pubDate>Wed, 19 Jun 2013 22:07:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/rgm/archive/2013/06/19/evitate-se-possibile-nhibernate-not-foundrdquoignorerdquo.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/rgm/comments/commentRss/101588.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/rgm/services/trackbacks/101588.aspx</trackback:ping>
        </item>
        <item>
            <title>NHibernate, criteria query e relazioni</title>
            <link>http://blogs.ugidotnet.org/rgm/archive/2007/12/04/90097.aspx</link>
            <description>&lt;p&gt;Supponiamo di avere le classi Customers e Orders del database northwind, abbiamo implementato la relazione many-to-one bidirezionale nel nostro domain model, così da avere una collection orders nella classe Customer, ed una proprietà Customer nell'oggetto order. Ora se si vuole prendere tutti gli ordini di "ALFKI" in un determinato range di tempo si può scrivere questa criteria query &lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;ICriteria&lt;/span&gt;&lt;span style="color: black;"&gt; criteria = session.CreateCriteria(&lt;/span&gt;&lt;span style="color: blue;"&gt;typeof&lt;/span&gt;&lt;span style="color: black;"&gt; (&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Order&lt;/span&gt;&lt;span style="color: black;"&gt;));&lt;br /&gt;
criteria.Add(&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Expression&lt;/span&gt;&lt;span style="color: black;"&gt;.Between(&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;"OrderDate"&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;DateTime&lt;/span&gt;&lt;span style="color: black;"&gt;(1997, 10, 1), &lt;/span&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;DateTime&lt;/span&gt;&lt;span style="color: black;"&gt;(1998, 1, 1)));&lt;br /&gt;
&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Customer&lt;/span&gt;&lt;span style="color: black;"&gt; cust = session.Load&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Customer&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;(&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;"ALFKI"&lt;/span&gt;&lt;span style="color: black;"&gt;);&lt;br /&gt;
criteria.Add(&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Expression&lt;/span&gt;&lt;span style="color: black;"&gt;.Eq(&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;"Customer"&lt;/span&gt;&lt;span style="color: black;"&gt;, cust));&lt;br /&gt;
&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;IList&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Order&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt; result = criteria.List&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Order&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;(); &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Notare come il riferimento all'oggetto Customer sia recuperato tramite il &lt;em&gt;Session.Load()&lt;/em&gt; cosi da creare un proxy e non andare a disturbare il database. Ma cosa succede se la relazione non è implementata in maniera bidirezionale, ma unidirezionale? Ad esempio se l'oggetto Order non ha nessuna proprietà che punta all'oggetto Customer? In questo caso è possibile fare una criteria query un po' "sporchina" dato che andiamo a referenziare direttamente i campi del nostro database. Ecco come fare: &lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;ICriteria&lt;/span&gt;&lt;span style="color: black;"&gt; criteria = session.CreateCriteria(&lt;/span&gt;&lt;span style="color: blue;"&gt;typeof&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Order2&lt;/span&gt;&lt;span style="color: black;"&gt;));&lt;br /&gt;
criteria.Add(&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Expression&lt;/span&gt;&lt;span style="color: black;"&gt;.Between(&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;"OrderDate"&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;DateTime&lt;/span&gt;&lt;span style="color: black;"&gt;(1997, 10, 1), &lt;/span&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;DateTime&lt;/span&gt;&lt;span style="color: black;"&gt;(1998, 1, 1)));&lt;br /&gt;
criteria.Add(&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Expression&lt;/span&gt;&lt;span style="color: black;"&gt;.Sql(&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;"{alias}.CustomerId = ?"&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;"ALFKI"&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;NHibernateUtil&lt;/span&gt;&lt;span style="color: black;"&gt;.String));&lt;br /&gt;
&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;IList&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Order2&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt; result = criteria.List&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Order2&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;(); &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Come si può vedere NHibernate fornisce un comodissimo criterio &lt;strong&gt;Sql&lt;/strong&gt; che permette di inserire condizioni su campi non mappati nel domain model, chiaramente questo è poco object oriented, ma è un altro degli strumenti da tenere nella cassetta degli attrezzi e da usare quando serve. &lt;/p&gt;
&lt;p&gt;A questo punto però i puristi storcerebbero il naso, cosa succede se cambio il nome dei campi del db? Con Nhibernate non dovrei mai fare query che contengono il nome dei campi sql!!! Si lo so avete ragione ed infatti anche se abbiamo una relazione unidirezionale da Customer a Orders tramite la proprietà Orders di Customer possiamo fare uso di subquery tramite la Criteria API &lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;DetachedCriteria&lt;/span&gt;&lt;span style="color: black;"&gt; subquery = &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;DetachedCriteria&lt;/span&gt;&lt;span style="color: black;"&gt;.For(&lt;/span&gt;&lt;span style="color: blue;"&gt;typeof&lt;/span&gt;&lt;span style="color: black;"&gt; (&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Customer2&lt;/span&gt;&lt;span style="color: black;"&gt;))&lt;br /&gt;
   .SetProjection(&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Projections&lt;/span&gt;&lt;span style="color: black;"&gt;.Property(&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;"Id"&lt;/span&gt;&lt;span style="color: black;"&gt;))&lt;br /&gt;
   .CreateAlias(&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;"Orders"&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;"Orders"&lt;/span&gt;&lt;span style="color: black;"&gt;)&lt;br /&gt;
   .Add(&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Expression&lt;/span&gt;&lt;span style="color: black;"&gt;.Eq(&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;"Id"&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;"ALFKI"&lt;/span&gt;&lt;span style="color: black;"&gt;))&lt;br /&gt;
   .Add(&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Property&lt;/span&gt;&lt;span style="color: black;"&gt;.ForName(&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;"Orders.Id"&lt;/span&gt;&lt;span style="color: black;"&gt;).EqProperty(&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;"order.Id"&lt;/span&gt;&lt;span style="color: black;"&gt;));&lt;br /&gt;
 &lt;br /&gt;
&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;ICriteria&lt;/span&gt;&lt;span style="color: black;"&gt; criteria = session.CreateCriteria(&lt;/span&gt;&lt;span style="color: blue;"&gt;typeof&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Order2&lt;/span&gt;&lt;span style="color: black;"&gt;), &lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;"order"&lt;/span&gt;&lt;span style="color: black;"&gt;);&lt;br /&gt;
criteria.Add(&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Expression&lt;/span&gt;&lt;span style="color: black;"&gt;.Between(&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;"OrderDate"&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;DateTime&lt;/span&gt;&lt;span style="color: black;"&gt;(1997, 10, 1), &lt;/span&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;DateTime&lt;/span&gt;&lt;span style="color: black;"&gt;(1998, 1, 1)));&lt;br /&gt;
criteria.Add(&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Subqueries&lt;/span&gt;&lt;span style="color: black;"&gt;.Exists(subquery));&lt;br /&gt;
&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;IList&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Order2&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt; result = criteria.List&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Order2&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;();&lt;br /&gt;
&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Assert&lt;/span&gt;&lt;span style="color: black;"&gt;.That(result.Count, &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Is&lt;/span&gt;&lt;span style="color: black;"&gt;.EqualTo(2));&lt;/span&gt;&lt;/span&gt; 	&lt;/p&gt;
&lt;p&gt;Che genera la seguente query in SQL &lt;/p&gt;
&lt;p&gt;exec sp_executesql N'SELECT this_.OrderId as OrderId1_0_, this_.OrderDate as OrderDate1_0_ FROM dbo.ORders this_ WHERE this_.OrderDate between @p0 and @p1 and exists (SELECT this_0_.CustomerId as y0_ FROM dbo.Customers this_0_ inner join dbo.ORders orders1_ on this_0_.CustomerId=orders1_.CustomerId WHERE this_0_.CustomerId = @p2 and orders1_.OrderId = this_.OrderId)', N'@p0 datetime,@p1 datetime,@p2 nvarchar(5)', @p0 = 'Oct  1 1997 12:00:00:000AM', @p1 = 'Jan  1 1998 12:00:00:000AM', @p2 = N'ALFKI' &lt;/p&gt;
&lt;p&gt;Alk.&lt;/p&gt;
&lt;p&gt;Technorati tags:&lt;a rel="tag" href="http://technorati.com/tags/NHibernate"&gt;NHibernate&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/rgm/aggbug/90097.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Gian Maria  Ricci</dc:creator>
            <guid>http://blogs.ugidotnet.org/rgm/archive/2007/12/04/90097.aspx</guid>
            <pubDate>Tue, 04 Dec 2007 21:22:21 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/rgm/archive/2007/12/04/90097.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/rgm/comments/commentRss/90097.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/rgm/services/trackbacks/90097.aspx</trackback:ping>
        </item>
        <item>
            <title>Provider di connessione per nhibernate - Precisazioni</title>
            <link>http://blogs.ugidotnet.org/rgm/archive/2007/08/03/87290.aspx</link>
            <description>&lt;p&gt;Nel &lt;a href="http://blogs.ugidotnet.org/rgm/archive/2007/08/03/87288.aspx"&gt;precedente post&lt;/a&gt; ho spiegato come realizzare un provider custom per le connessioni in nhibernate al fine di potere iniettare una connessione in una sessione. Per completezza è il caso di citare che il metodo &lt;em&gt;SessionFactory.OpenSession()&lt;/em&gt; ha una versione in overload che accetta un oggetto IDbConnection come parametro. Il risultato è praticamente analogo e sicuramente si scrive meno codice rispetto all'esempio precedente. Il contro di questa tecnica è che spesso si debbono eseguire dei test su classi che internamente creano una sessione (o prendono quella della conversazione corrente). Queste classi chiaramente invocano il metodo &lt;em&gt;SessionFactory.OpenSession()&lt;/em&gt; senza preoccuparsi della gestione della connessione e grazie al ConnectionProvider si può intervenire trasparentemente iniettando la propria connessione senza che il codice di produzione si accorga della differenza. 
&lt;/p&gt;&lt;p&gt;Alk.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/rgm/aggbug/87290.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Gian Maria  Ricci</dc:creator>
            <guid>http://blogs.ugidotnet.org/rgm/archive/2007/08/03/87290.aspx</guid>
            <pubDate>Fri, 03 Aug 2007 23:56:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/rgm/archive/2007/08/03/87290.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/rgm/comments/commentRss/87290.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/rgm/services/trackbacks/87290.aspx</trackback:ping>
        </item>
        <item>
            <title>Provider di connessioni per nhibernate</title>
            <link>http://blogs.ugidotnet.org/rgm/archive/2007/08/03/87288.aspx</link>
            <description>&lt;p&gt;Debbo dire che più conosco nhibernate più lo apprezzo veramente tanto. Stasera mi sono chiesto, posso iniettare una mia connessione in una sessione? Lo scopo di una simile operazione è vario, potrei ad esempio iniettare una connessione durante un test per potere poi fare query dirette al database e verificare che i dati siano scritti bene, oppure potrei volere eseguire codice SQL diretto assieme a nhibernate in una unica transazione etc etc. LA soluzione a questo problema è veramente banale :D.
&lt;/p&gt;&lt;p&gt;Nhibernate definisce un interfaccia chiamata &lt;em&gt;IConnectionProvider&lt;/em&gt; tramite la quale la sessionFactory recupera la connessione da dare in pasto alla sessione, solitamente viene utilizzato un provider di default definito da queste due righe di configurazione.
&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas"&gt;&lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;add&lt;/span&gt;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;key&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&lt;span style="color:black"&gt;"&lt;/span&gt;&lt;span style="color:blue"&gt;hibernate.connection.provider&lt;/span&gt;&lt;span style="color:black"&gt;"&lt;/span&gt;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;value&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&lt;span style="color:black"&gt;"&lt;/span&gt;&lt;span style="color:blue"&gt;NHibernate.Connection.DriverConnectionProvider&lt;/span&gt;&lt;span style="color:black"&gt;"&lt;/span&gt;&lt;span style="color:blue"&gt; /&amp;gt;&lt;/span&gt;&lt;span style="color:black"&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;add&lt;/span&gt;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;key&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&lt;span style="color:black"&gt;"&lt;/span&gt;&lt;span style="color:blue"&gt;hibernate.connection.connection_string&lt;/span&gt;&lt;span style="color:black"&gt;"&lt;/span&gt;&lt;span style="color:blue"&gt;   &lt;/span&gt;&lt;span style="color:red"&gt;value&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&lt;span style="color:black"&gt;"&lt;/span&gt;&lt;span style="color:blue"&gt;MiaStringaConnessione&lt;/span&gt;&lt;span style="color:black"&gt;"&lt;/span&gt;&lt;span style="color:blue"&gt; /&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;NAturalmente se si volesse creare un proprio provider è sufficiente ereditare da una classe astratta chiamata ConnectionProvider, di cui è possibile implementare la sola funzione &lt;em&gt;GetConnection()&lt;/em&gt;.
&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas"&gt;&lt;span style="color:blue"&gt;public&lt;/span&gt;&lt;span style="color:black"&gt; &lt;/span&gt;&lt;span style="color:blue"&gt;class&lt;/span&gt;&lt;span style="color:black"&gt; &lt;/span&gt;&lt;span style="color:#2b91af"&gt;MyConnectionProvider&lt;/span&gt;&lt;span style="color:black"&gt; : &lt;/span&gt;&lt;span style="color:#2b91af"&gt;ConnectionProvider&lt;/span&gt;&lt;span style="color:black"&gt;  {&lt;br/&gt; &lt;br/&gt;   &lt;/span&gt;&lt;span style="color:blue"&gt;public&lt;/span&gt;&lt;span style="color:black"&gt; &lt;/span&gt;&lt;span style="color:blue"&gt;override&lt;/span&gt;&lt;span style="color:black"&gt; System.Data.&lt;/span&gt;&lt;span style="color:#2b91af"&gt;IDbConnection&lt;/span&gt;&lt;span style="color:black"&gt; GetConnection() {&lt;br/&gt;      &lt;/span&gt;&lt;span style="color:#2b91af"&gt;IDbConnection&lt;/span&gt;&lt;span style="color:black"&gt; conn = &lt;/span&gt;&lt;span style="color:blue"&gt;new&lt;/span&gt;&lt;span style="color:black"&gt; &lt;/span&gt;&lt;span style="color:#2b91af"&gt;SqlConnection&lt;/span&gt;&lt;span style="color:black"&gt;(&lt;/span&gt;&lt;span style="color:#a31515"&gt;"Server=localhost\\sql2000;initial catalog=NorthWind;User Id=sa;password=ottaedro_2006@"&lt;/span&gt;&lt;span style="color:black"&gt;);&lt;br/&gt;      conn.Open();&lt;br/&gt;      &lt;/span&gt;&lt;span style="color:blue"&gt;return&lt;/span&gt;&lt;span style="color:black"&gt; conn;&lt;br/&gt;   }&lt;br/&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Come si può vedere nell'esempio in questione la connessione viene costruita con una stringa hardcoded, ma le possibilità sono indubbiamente aperte alla nostra fantasia. Chiaramente per sfruttare questo nuovo provider di connessioni è necessario specificare la classe desiderata nel file di configurazione e la connessione restituita deve essere stata precedentemente aperta.
&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas"&gt;&lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;add&lt;/span&gt;&lt;span style="color:black"&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color:blue"&gt;         &lt;/span&gt;&lt;span style="color:red"&gt;key&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&lt;span style="color:black"&gt;"&lt;/span&gt;&lt;span style="color:blue"&gt;hibernate.connection.provider&lt;/span&gt;&lt;span style="color:black"&gt;"&lt;br/&gt;&lt;/span&gt;&lt;span style="color:blue"&gt;         &lt;/span&gt;&lt;span style="color:red"&gt;value&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&lt;span style="color:black"&gt;"&lt;/span&gt;&lt;span style="color:blue"&gt;NorthwindTest.MyConnectionProvider, NorthwindTest&lt;/span&gt;&lt;span style="color:black"&gt;"&lt;/span&gt;&lt;span style="color:blue"&gt; /&amp;gt;&lt;/span&gt;&lt;span style="color:black"&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;add&lt;/span&gt;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;key&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&lt;span style="color:black"&gt;"&lt;/span&gt;&lt;span style="color:blue"&gt;hibernate.connection.connection_string&lt;/span&gt;&lt;span style="color:black"&gt;"&lt;/span&gt;&lt;span style="color:blue"&gt;   &lt;/span&gt;&lt;span style="color:red"&gt;value&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&lt;span style="color:black"&gt;"&lt;/span&gt;&lt;span style="color:blue"&gt;MiaStringaConnessione&lt;/span&gt;&lt;span style="color:black"&gt;"&lt;/span&gt;&lt;span style="color:blue"&gt; /&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Non dimenticate di mettere sempre la configurazione connection_string perchè se non presente l'oggetto ConnectionProvider di base genererà un eccezione.
&lt;/p&gt;&lt;p&gt;Alk.
&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/rgm/aggbug/87288.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Gian Maria  Ricci</dc:creator>
            <guid>http://blogs.ugidotnet.org/rgm/archive/2007/08/03/87288.aspx</guid>
            <pubDate>Fri, 03 Aug 2007 22:56:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/rgm/archive/2007/08/03/87288.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/rgm/comments/commentRss/87288.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/rgm/services/trackbacks/87288.aspx</trackback:ping>
        </item>
    </channel>
</rss>