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

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

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

Запросы критериев, не кажутся достаточно текущими.

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

EDIT: стоит прочитать http://www.ayende.com/Blog/archive/2007/03/17/Implementing-Linq-for-NHibernate-A-How-To-Guide--Part.aspx

Ответ 1

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

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

LINQ для NHibernate: сопоставление O/R в Visual Studio 2008 Слайды и код

Ответ 2

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

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

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

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

Ответ 3

Я использую 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 обработать рефакторинг запросов?

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

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

Ответ 4

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

См:

Ответ 5

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

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