Edit 2: Ну, я сделал еще один поиск по SO и я думаю, что вы должны смотреть на this answer. Я не могу воспроизвести вашу проблему, так что или здесь есть что-то другое (ваши конфигурации или модели домена?), Или я полностью не понимаю смысла. Удачи!
Я собираюсь попытаться угадать причину здесь (я не использую C# или HQL, так что если что-то в этой области, я может быть не повезло). Я думаю, что вы видите, потому что используете бескамерную версию метода .List()
. Вы должны попытаться использовать .List<T>()
, который будет указывать тип, который вы ожидаете при перечислении своих объектов.
Я думаю, что
Еогеасп (вар документ в query.List <T>
()) { fullTextSession.Index (док); }
должен сделать трюк.
Edit: ИТАК, видимо, он не работает с добавленным <T>
(видимо фрагмента кода поел скобки, поэтому убедитесь, что вы копируете вставили правильную версию, если вы сделали это).
FWIW, что мы делаем на работе ниже. Мы используем шаблон UnitOfWork, поэтому UnitOfWork запускает текущую конфигурацию и сеанс Nhibernate. Я использовал отражатель, чтобы перейти от 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();
}
}
}
}
}
Я собираюсь попытаться воспроизвести вас проблему в более компактной образом
Спасибо, сэми, к сожалению, это не проблема. – JAG
Сэмми, спасибо за ваши усилия, я очень ценю это. Я тестировал ваш код и изучал проблему. В конфигурации я установил Interceptor (чтобы помочь мне привязать данные к объектам), и это вызывает проблему. Если перехватчик не установлен, я не получаю повторяющиеся записи. Так что это, кажется, проблема. Я обновлю сообщение, когда буду уверен, что проблема ушла. Еще раз спасибо. – JAG
Нет проблем, я с облегчением вижу, что это была внешняя проблема, а не странная ошибка – samy