Использование интерфейса для подзапроса в Nibernate
-
30-09-2019 - |
Вопрос
Я обычно запрашиваю интерфейсы, используя детектирующиеcriterial в Nibernate:
DetachedCriteria crit = DetachedCriteria.For<IParent>();
И это работает нормально.
Теперь я хочу создать подзапрос для дочернего объекта:
DetachedCriteria subcrit = DetachedCriteria.For<IChild>();
и добавьте его к критериям, как это (вид, p.child на самом деле псевдоним, но я упрощенный):
crit.Add(LambdaSubquery.Property<IParent>(p => p.Child.ChildID).In(subcrit));
Это работает, если мои детечкоклики для ребенка:
DetachedCriteria subcrit = DetachedCriteria.For<Child>();
Но не это для интерфейса (как указано выше). В этом случае я получаю исключение:
NHibernate.MappingException: No persister for: Domain.Name.Space.IChild
Это то, что должно быть или я скучаю по конфигурации?
Решение
Я не думаю, что вы сможете запросить через интерфейс в этом случае, потому что Nibernate не сможет найти правильный класс реализации, который вы предназначены для запроса. Например, предположим, что у вас есть другой носитель IChild под названием Childlight (или что-то, что сопоставлено на другую таблицу), Nibernate не имеет направления, для которого реализован класс для получения.
Вам необходимо создать детектирующиеCRITERIA. Для <Child> (), а не интерфейс.