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

Я немного опоздал, но у меня была аналогичная проблема:

λ: let xs = [1,2,3]
xs :: Num t => [t]
λ: :sprint xs
xs = _
λ: print xs
λ: :sprint xs
xs = _

Эта проблема специфична для полиморфных значений. Если у вас есть -XNoMonomorphismRestriction включен ghci никогда не будет действительно оценивать / усиливать xs, он будет оценивать только / специализации:

λ: :set -XMonomorphismRestriction
λ: let xs = [1,2,3]
xs :: [Integer]
λ: print xs
λ: :sprint xs
xs = [1,2,3]
11
задан Will Dean 7 April 2009 в 15:19
поделиться

5 ответов

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

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

LINQ для NHibernate: O/R, Отображающийся в Слайдах Visual Studio 2008 года и Коде

5
ответ дан 3 December 2019 в 10:27
поделиться

Я использую 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 очень быстро.

1
ответ дан 3 December 2019 в 10:27
поделиться

Для избавления себя от XML попробуйте Быстрый NHibernate

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

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

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

3
ответ дан 3 December 2019 в 10:27
поделиться

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

nHibernate был хорошим ORM, когда Дозвуковой не был вокруг, но теперь, это просто ужасно для работы с в сравнении. Это легко берет меня в 2 раза дольше, чтобы сделать материал с nHibernate по сравнению с Дозвуковым. Тестирование является болью, так как nHibernate является временем выполнения, поэтому теперь я должен нанять несколько инженеров по контролю качества для "нажимания" вокруг сайта вместо того, чтобы получить ошибку времени компиляции.

-1
ответ дан 3 December 2019 в 10:27
поделиться

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

См.:

1
ответ дан 3 December 2019 в 10:27
поделиться