LiquiBase - ваш лучший выбор. Он имеет режим интеграции hibernate , который использует hbm2ddl Hibernate для сравнения вашей базы данных и вашего отображения hibernate, но вместо автоматического обновления базы данных он выводит файл журнала изменений в liquibase, который можно проверить перед фактическим запуском.
Хотя это и удобнее, любой инструмент, который выполняет сравнение вашей базы данных и ваших отображений гибернации, может ошибаться. См. http://www.liquibase.org/2007/06/the-problem-with-database-diffs.html для примеров. С помощью liquibase вы создаете список изменений базы данных по мере разработки в формате, который может выдержать код с ответвлениями и слияниями.
Помните, что NHibernate наследует ваши классы и не использует их напрямую согласно своей реализации IList. Вероятно, это не то, что вы хотите услышать, но поскольку ваши классы проксируются, а текущая реализация Linq вообще не обрабатывает это правильно, в этом и заключается проблема.
Комбинация универсального метода с использованием проксированного класса в критериях для Linq просто взрывается во многих отношениях с текущей реализацией. Как сказал ShaneC в своих комментариях, есть веская причина, по которой они вернулись и начали переписывать его с нуля.
Я знаю, что вы сделали после исправления, но, к сожалению, в этом случае ответ - дождаться завершения NHibernate 2.1 или использовать обходной путь, как вы делаете сейчас.
Насколько я понимаю, текущая реализация Linq to NHibernate довольно ограничена.
В настоящее время пытаются переписать его с последним обновлением, доступным здесь:
Черт. Я забыл добавить решение, которое работает:
public virtual IList<TEntity> GetByMultipleIds(int[] ids)
{
var result = Session
.CreateCriteria(typeof (TEntity))
.Add(Restrictions.In("Id", ids))
.List<TEntity>();
result = ids.Join //to order list by passed ids
(result, id => id, r => r.Id, (i, r) => r).ToList();
return result;
}