2

Я обычно запрашивать интерфейсы, используя DetachedCriteria в NHibernate:Используя интерфейс для подзапроса в NHibernate

DetachedCriteria crit = DetachedCriteria.For<IParent>(); 

И это работает отлично.

Теперь я хочу, чтобы создать подзапрос для дочернего объекта таким образом:

DetachedCriteria subcrit = DetachedCriteria.For<IChild>(); 

и добавить его к критериям, как этот (вид, p.Child на самом деле это псевдоним, но я упростил):

crit.Add(LambdaSubquery.Property<IParent>(p => p.Child.ChildID).In(subcrit)); 

Это работает, если мой DetchedCriteria для ребенка:

DetachedCriteria subcrit = DetachedCriteria.For<Child>(); 

, но это не для интерфейса (как указано выше). В этом случае я получаю исключение:

NHibernate.MappingException: No persister for: Domain.Name.Space.IChild 

Является ли это чем-то, что должно быть или мне не хватает какой-либо конфигурации?

+1

Является ли IChild явно ссылкой на любые сопоставления? Если я не думаю, что вам нужно это (.Import в свободном nhibernate, я думаю) – Nicholas

+0

Есть ли способ выполнить такой импорт с отображением HBN (например, без Fluent Nhibernate)? –

ответ

0

Я не думаю, что вы могли бы запросить интерфейс в этом случае, потому что NHibernate не сможет найти правильный класс реализации, к которому вы хотите запросить. Например, предположим, что у вас есть другой разработчик IChild с именем ChildLight (или что-то, что сопоставляется с другой таблицей), NHibernate не имеет никакого направления, для которого должен быть реализован класс реализации.

Вам необходимо создать DetachedCriteria.For < Ребенок>(), а не интерфейс.