Как строго набирать критерии при использовании метода CreateCriteria от NHibernate? - PullRequest
2 голосов
/ 28 июля 2010

В настоящее время я впервые использую NHibernate с Fluent NHibernate.Я все правильно настроил, однако теперь я приступил к поиску некоторых данных, похоже, они не оправдались.

Я ожидал, что NHibernate позволит мне сделать что-то вроде:

session.CreateCriteria<TblDocket>()
    .Add(Restrictions.Eq(x=> x.DocketNumber, "10101"));

Однако, похоже, что это не так, и мне, кажется, нужно написать:

session.CreateCriteria<TblDocket>()
    .Add(Restrictions.Eq("DocketNumber", "10101"));

Это будет менее чем замечательно, когда я переименую любые свойства!Я всегда думал, что жестко закодированные строки в коде - это плохо, особенно когда строки относятся к именам свойств.

Можно ли как-то строго ввести эти ограничения?Я посмотрел на это сообщение в блоге, но это выглядит довольно грязно, есть ли лучшее решение?

Ответы [ 4 ]

2 голосов
/ 28 июля 2010

Я решил использовать NHibernate.Linq . Я нашел блестящий учебник здесь .

1 голос
/ 10 апреля 2012

, начиная с NHibernate 3.0, также доступно QueryOver, которые являются хорошей типобезопасной оболочкой для API критериев.

session.QueryOver<TblDocket>()
    .Where(x => x.DocketNumber, "10101");
1 голос
/ 28 июля 2010

Вы не можете использовать готовый NHibernate. Существует проект под названием NHibernate Lambda Extensions , который позволяет вам делать это с некоторыми ограничениями.

0 голосов
/ 30 июля 2010

Для тех, кто заходит по этому посту и не любит linq или не слишком знаком с лямбдой, вы все равно можете безопасно использовать ICrierta, например

session.CreateCriteria<TblDocket>().Add(Restrictions.Eq("DocketNumber", "10101"));

вам нужны вспомогательные классы, чтобы вы могли удалить магические строки, такие как «DocketNumber», чтобы при изменении имен ваших свойств или имен столбцов они позаботились о вас или по крайней мере вызвали ошибку сборки, чтобы вы знали прежде чем опубликовать свой код. Любой, кто хочет посмотреть пример, может взглянуть на NhGen (http://sourceforge.net/projects/nhgen/) и примеры запросов на https://sourceforge.net/projects/nhgen/forums/forum/1169117/topic/3789112, которые показывают, как могут использоваться классы помощников.

// Find using a simple entity query 
IList<IMessage> messageList3 = messageDao.Find( new [] { Restrictions.Le(MessageHelper.Columns.Date, dateLastChecked) } ); 

Обратите внимание, что этот проект также создал классы обертки сущностей, которые группируют все ваши общие методы CRUD в один класс (xxxDao, как показано выше), поэтому вам не нужно копировать один и тот же код снова и снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...