2010-07-28 1 views
2

В настоящее время я использую NHibernate в первый раз с Fluent NHibernate. Я получил все настройки хорошо, однако теперь я пришел к фактическому выполнению некоторых операций по извлечению данных, кажется, что он упал.Как я могу категоризировать критерии при использовании метода CreateCriteria NHibernate?

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

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

Однако, это, кажется, не так, и я, кажется, должен написать:

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

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

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

ответ

2

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

+0

Взгляните на http://www.tobinharris.com/past/2008/8/17/linq-for-nhibernate-examples/ – rebelliard

1

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

0

Для тех, кто приходит этот пост и не любит или 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, как показано выше), так что вы не должны держать копировать один и тот же код снова и снова.

1

С тех пор, как NHibernate 3.0 имеется также QueryOver, которые являются красивой оболочкой типов по критериям API.

session.QueryOver<TblDocket>() 
    .Where(x => x.DocketNumber, "10101"); 

 Смежные вопросы

  • Нет связанных вопросов^_^