0

当我从现有数据库构建初始索引时,Lucene 中的条目类型被索引为 <_hibernate_class:Castle.Proxies。MuestraProxy , DynamicProxyGenAssembly2>

但是,当使用 NHibernate 添加新实体时,它会被索引为 <_hibernate_class:RALVet.Model。Muestra , RALVet>} 在 Lucene 中创建重复条目,一个作为真实类,另一个作为其代理。

我在构建索引时尝试使用 NHibernateUtil.GetClass() 但它仍然返回代理。

这是构建初始索引的代码:

private static void CreateIndex<T>()
    {
        var fullTextSession =
            NHibernate.Search.Search.CreateFullTextSession(BootStrapper.SessionFactory.OpenSession());
        using(var tran = fullTextSession.BeginTransaction())
        {
            var query = fullTextSession.CreateQuery(string.Concat("from ", typeof (T).Name));

            foreach (var doc in query.List())
            {
                fullTextSession.Index(doc);
            //  fullTextSession.Index(NHibernateUtil.GetClass(doc));
            }
            tran.Commit();
        }
        fullTextSession.Close();
    }
4

2 回答 2

0

编辑 2:好吧,我对 SO 进行了另一次搜索,我认为你应该看看这个答案。我无法重现您的问题,所以要么这里有其他东西(您的配置或域模型?),要么我完全错过了重点。祝你好运!


我将在这里尝试猜测原因(我不使用 C# 或 hql,所以如果它在这个领域,我可能不走运)。我认为您看到的是因为您使用了该.List()方法的无类型版本。您应该尝试使用.List<T>()它来指定您在列出实体时所期望的类型。

我觉得

foreach (var doc in query.List <T>()) { fullTextSession.Index(doc); }

应该做的伎俩。


编辑:好的,显然它不适用于添加的<T>(显然代码片段吃了括号,所以如果你这样做了,请确保你复制粘贴了正确的版本)。

FWIW,我们正在做的工作如下。我们使用 UnitOfWork 模式,因此 UnitOfWork 启动当前的 Nhibernate 配置和会话。我使用 Reflector 从 Vb.net 转到 c#

            DocumentBuilder db = SearchFactoryImpl.GetSearchFactory(UnitOfWork.Configuration).GetDocumentBuilder(typeof(T));
            IList<T> results = null;
            PropertyInfo pi = typeof(T).GetProperty("Id");
            // an internal method that pages the data from the DB, returning true while there's more to process
            while (this.InnerPageThrough<T>(ref results, pageNumber, itemsPerPage))
            {
                IndexWriter iw = new IndexWriter(this.CheminIndexation + @"\" + typeof(T).Name, new StandardAnalyzer(), false);
                iw.SetMaxMergeDocs(0x186a0);
                iw.SetMergeFactor(0x3e8);
                iw.SetMaxBufferedDocs(0x2710);
                iw.SetUseCompoundFile(false);
                using (Timer.Start("indexing + Conversions.ToString(results.Count) + " objects " + typeof(T).Name))
                {
                    // Sorry, looks like crap through the translation
                    IEnumerator<T> VB$t_ref$L3;
                    try
                    {
                        VB$t_ref$L3 = results.GetEnumerator();
                        while (VB$t_ref$L3.MoveNext())
                        {
                            T Entity = VB$t_ref$L3.Current;
                            object EntityId = RuntimeHelpers.GetObjectValue(pi.GetValue(Entity, null));
                            iw.AddDocument(db.GetDocument(Entity, RuntimeHelpers.GetObjectValue(EntityId), typeof(T)));
                        }
                    }
                    finally
                    {
                        if (VB$t_ref$L3 != null)
                        {
                            VB$t_ref$L3.Dispose();
                        }
                    }
                }
                iw.Flush(true, true, true);
                iw.Close();
                UnitOfWork.CurrentSession.Clear();
                pageNumber++;
            }
            if (Optimize)
            {
                using (Timer.Start("optimising index"))
                {
                    IndexWriter iw = new IndexWriter(this.CheminIndexation + @"\" + typeof(T).Name, new StandardAnalyzer(), false);
                    iw.Optimize();
                    iw.Close();
                }
            }
        }
    }
}

我将尝试以更精简的方式重现您的问题

于 2011-01-11T09:26:15.400 回答
0

好的,我终于让它完美地工作了。

问题是我使用拦截器在我的实体中注入 INotifyPropertyChanged 实现。移除拦截器使 NH.Search 和 Lucene.net 可以正常工作。

于 2011-01-21T08:55:44.597 回答