Hi,

I'm trying to implement full-text search functionality with
NHibernate.Search 1.2.1.4000, Lucene.NET 2.0.0.4 and
Castle.ActiveRecord 1.0.3.0.

The main problem is, that I have to register a SearchInterceptor in
order to hook NHibernate.Search into NHibernate so that it can
automatically maintain the search index.
(Source: 
http://using.castleproject.org/display/AR/Using+NHibernate.Search+with+ActiveRecord
)

Well, most examples based on NHibernate suggest to open a new session
with the SearchInterceptor attached:

            using (ISession session =
Global.SessionFactory.OpenSession(new SearchInterceptor()))
            using (IFullTextSession fullTextSession =
Search.CreateFullTextSession(session))
            using (NHibernate.ITransaction tx =
session.BeginTransaction())
            { ... }

But in ActiveRecord this is different. Using the code above creates a
new session which is not linked to the SessionScope / TransactionScope
of ActiveRecord. So any rollback fails or session timeouts may occur.
Instead I would rather prefer to init the full-text session like this:

            using (var tx = new TransactionScope())
            {
                  var factory =
ActiveRecordMediator.GetSessionFactoryHolder().GetSessionFactory(typeof(Description));
                  var session = tx.GetSession(factory);
                  IFullTextSession fullTextSession =
NHibernate.Search.Search.CreateFullTextSession(session);

                  ...
            }

Unfortunately the code above throws a HibernateException:
"\r\nThe session interceptor was not a SearchInterceptor.\r\nIn order
to use Full Text Query, you must open the session with a
SearchInterceptor. Like this:\r\nsessionFactory.OpenSession(new
SearchInterceptor());\r\n"

Well, but that's not what I want, because the MSSQL Profiler tells me,
that this call always leads to another db transaction and additional
login.
So I tried to figure out if there is any other solution ... and there
is! NHibernate.Cfg.Configuration offers the SetInterceptor() method.
Afterwards my intialization code looked like this:

       IConfigurationSource source =
ActiveRecordSectionHandler.Instance;
       ActiveRecordStarter.Initialize(typeof(Description).Assembly,
source);

       ISessionFactoryHolder holder =
ActiveRecordMediator.GetSessionFactoryHolder();
       NHibernate.Cfg.Configuration configuration =
holder.GetConfiguration(typeof(ActiveRecordBase));

       configuration.SetInterceptor(new SearchInterceptor());   //  <-
adds the interceptor

       SearchFactory.Initialize(configuration,
holder.GetSessionFactory(typeof(Description)));

But the code above still throws a HibernateException with the same
error message as above.
So how do I hook NHibernate.Search into ActiveRecord & NHibernate
without using OpenSession?
In my humble opinion, I have to access the Interceptor directly
through ActiveRecord. But that didn't work out either, because the
property is readonly. Of course I could use Reflection to access it,
but I don't want to mess around with internal code.
Do you have an idea?

The activerecord documentation wasn't quite helpful, too:
http://www.castleproject.org/activerecord/documentation/trunk/advanced/hooks.html

By the way, here are my app settings:

<activerecord isWeb="false">
  <config>
 <add key="hibernate.connection.driver_class"
value="NHibernate.Driver.SqlClientDriver" />
 <add key="hibernate.dialect"
value="NHibernate.Dialect.MsSql2000Dialect" />
                        <add key="hibernate.connection.provider"
value="NHibernate.Connection.DriverConnectionProvider" />
                        <add key="hibernate.max_fetch_depth" value="3"></add>
                        <add key="hibernate.connection.connection_string"
value="ConnectionString = ${myConnectionString}" />
                        <add key="hibernate.show_sql" value="true" />
                        <add key="hibernate.search.default.directory_provider"
value="NHibernate.Search.Storage.FSDirectoryProvider,
NHibernate.Search" />
                        <add key="hibernate.search.default.indexBase"
value="Index"/>
                        <add key="hibernate.search.analyzer"
value="Lucene.Net.Analysis.Standard.StandardAnalyzer, Lucene.Net"/>
                </config>
  </activerecord>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Castle Project Users" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/castle-project-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to