Лучшие практики для запросов с NHibernate

Я вернулся к использованию NHibernate после использования других технологий (CSLA и Subsonic) в течение нескольких лет, и я нахожу запросы немного разочаровывающими, особенно по сравнению с Subsonic. Мне было интересно, какие еще подходы используют люди?

Язык запросов Hibernate мне не подходит, он слишком похож на написание SQL, что, на мой взгляд, является одной из причин использовать инструменты ORM, поэтому мне не нужно, кроме того, все это в XML, что означает плохо для рефакторинга, и ошибки будут обнаруживаться только во время выполнения?

Критерии запросов кажутся недостаточно гибкими.

У меня есть прочтите, что NHibernate Query Generator, созданный Айенде, полезный инструмент, это то, что люди используют? Что еще есть?

РЕДАКТИРОВАТЬ: стоит прочитать http://www.ayende.com/Blog/archive/2007/03/17/Implementing-Linq-for-NHibernate-A-How-To-Guide--Part.aspx


person Dan    schedule 04.09.2008    source источник
comment
Я в равной степени разочарован, и мне кажется, что мы заменяем хранимые процедуры чем-то столь же ужасным в разработке и сопровождении.   -  person rshimoda    schedule 29.10.2008


Ответы (5)


LINQ для NHibernate все еще находится в стадии бета-тестирования; Я с нетерпением жду NHibernate 2.1, где, как говорят, он наконец-то будет сокращен.

Около месяца назад я сделал презентацию LINQ для NHibernate, она может вам пригодиться. Я писал об этом здесь, включая слайды и код:

LINQ для NHibernate: отображение O / R в слайдах и коде Visual Studio 2008

person Jon Limjap    schedule 04.09.2008

Чтобы избавиться от XML, попробуйте Fluent NHibernate

Linq2NH еще не полностью готов. Основная команда работает над реализацией, отличной от той, что была в NH Contrib. Однако он отлично работает для простых запросов. Для достижения наилучших результатов используйте умеренно, если вообще используйте.

Что касается того, как запрашивать (hql против критериев против Linq2NH), выставьте методы выявления намерений (GetProductsForOrder(Order order), GetCustomersThatPurchasedProduct(Product product) и т.д.) в интерфейсе вашего репозитория и реализуйте их наилучшим образом. Простые запросы могут быть проще с hql, хотя при использовании шаблона спецификации вы можете найти Criteria API лучше. Этот материал просто остается инкапсулированным в вашем репозитории, и если ваши тесты пройдут, не имеет большого значения, как вы его реализуете.

Я обнаружил, что API критериев громоздок и ограничен, но гибок. HQL - это больше мой стиль (и он лучше, чем SQL - он основан на объектах, а не на схемах) и, кажется, мне лучше подходит для простых методов GetX ..

person Matt Hinze    schedule 07.09.2008

По умолчанию я использую Linq для NHibernate. Когда я сталкиваюсь с ошибками или ограничениями, я переключаюсь на HQL.

Это чистый подход, если вы храните все свои запросы вместе в классе доступа к данным, например в репозитории.

public class CustomerRepostitory()
{ 
  //LINQ for NHibernate     
  public Customer[] FindCustomerByEmail(string email)
  {
     return (from c in _session.Linq<Customer>() where c.Email == email).FirstOrDefault();
  }

  //HQL
  public Customer[] FindBestBuyers()
  {
    var q = _session.CreateQuery("...insert complex HQL here...");
    return q.List<Customer>();
  }
}

Вы спросили о рефакторинге. О LINQ, очевидно, заботится среда IDE, поэтому для любого оставшегося HQL довольно легко просканировать эти классы репозитория и изменить HQL вручную.

Помещение HQL в файлы XML - хорошая практика, возможно, посмотрите, есть ли подключаемый модуль ReSharper NHIbernate уже может справиться с рефакторингом запроса?

Большое улучшение при написании или рефакторинге запросов (HQL или LINQ) - это включение методов поиска в модульное тестирование. Таким образом, вы можете быстро настроить HQL / LINQ, пока не получите зеленую полосу. Цикл компиляции / тестирования / обратной связи выполняется очень быстро, особенно если вы используете для тестирования базу данных в памяти.

Кроме того, если вы забыли редактировать HQL после рефакторинга, модульные тесты должны очень быстро сообщить вам о сломанном HQL.

person tobinharris    schedule 15.10.2008

Альтернативой LINQ-to-NHibernate и NHQG Айенде является генерация выражений / ограничений NHibernate из выражений C # 3. Таким образом, вы получаете более строго типизированный API критериев.

Видеть:

person Mauricio Scheffer    schedule 01.12.2008

откажитесь от nHibernate и вернитесь к Subsonic, если сможете. На мой взгляд, Subsonic - это ORM / DAL, который гораздо легче и удобнее тестировать. Я абсолютно ненавижу HQL, в чем смысл слабо типизированного запроса в ORM? И зачем мне использовать Linq / nH / SQL, если я могу просто использовать Linq to SQL и вырезать слой?

nHibernate был хорошей ORM, когда Subsonic не существовало, но сейчас с ним просто ужасно работать по сравнению. Мне легко требуется в 2 раза больше времени, чтобы делать что-то с nHibernate vs Subsonic. Тестирование - это боль, поскольку nHibernate - это среда выполнения, поэтому теперь мне нужно нанять несколько инженеров QA, чтобы они «щелкали» по сайту вместо того, чтобы получать ошибку времени компиляции.

person Community    schedule 04.02.2009
comment
А как насчет производительности и сложного картографирования с дозвуковыми? Лучше чем NHibernate? - person pabloide86; 10.03.2009
comment
Зачем нанимать нескольких QA-инженеров, если вы можете использовать инструменты тестирования (nunit, mbunit и т. Д.), Чтобы проводить большую часть тестирования за вас. nhibernate, и я предполагаю, что большинство orms (включая дозвуковые) очень хорошо работают в этом сценарии - person Nathan Fisher; 05.08.2009
comment
‹Quote› зачем мне использовать Linq / nH / SQL, если я могу просто использовать Linq to SQL и вырезать слой? ‹/Quote› Ну, Linq2SQL поддерживает только сервер MsSQl, с одной стороны. Linq2NH поддерживает все СУБД, поддерживаемые NH. - person UpTheCreek; 15.05.2010