Nhibernate - застрял с отстраненными критериями (asp.net mvc 1 с nhibernate 2) c # - PullRequest
0 голосов
/ 25 февраля 2011

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

У меня есть 2 таблицы.Placement и PlacementSupervisor

Моя таблица PlacementSupervisor имеет FK of PlacementID, который относится к Placement.PlaceID - хотя мой класс модели nhibernate имеет PlacementSupervisor.Место размещения (а не конкретное указание свойства идентификатора места размещения - не уверен, важно ли это).

Я пытаюсь сделать следующее: если передаются значения для идентификатора супервизора, я хочу ограничить места размещения этимидентификатор супервизора.

Пытались:

ICriteria query = m_PlacementRepository.QueryAlias("p")
....
    if (criteria.SupervisorId > 0 && !string.IsNullOrEmpty(criteria.SupervisorTypeId))
                {

                    DetachedCriteria entityQuery = DetachedCriteria.For<PlacementSupervisor>("sup")
                         .Add(Restrictions.And(
                                       Restrictions.Eq("sup.supervisorId", criteria.SupervisorId),
                                      Restrictions.Eq("sup.supervisorTypeId", criteria.SupervisorTypeId)
                                   ))
                    .SetProjection(Projections.ProjectionList()
                                       .AddPropertyAlias("Placement.PlacementId", "PlacementId")
                                       );
                    query.Add(Subqueries.PropertyIn("p.PlacementId", entityQuery));
                }

, который просто дает мне ошибку: Не удалось найти поставщика информации о критериях соответствия для: (sup.supervisorId = 5 и sup.supervisorTypeId = U)

Во-первых, supervisorTypeId - это строка.Во-вторых, я не понимаю, как добиться того, что я пытаюсь сделать, поэтому просто пробовал различные комбинации проекций, а также псевдонимов свойств и опций подзапросов… поскольку я не понимаю, как я должен присоединиться к другой таблице/ entity, когда клавиша FK находится во второй таблице.

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

Ответы [ 2 ]

1 голос
/ 25 февраля 2011

Это может помочь.Это хороший обзор критериев API от Фабио Мауло

Обычно вы используете DeteachedCriterias, если не хотите сразу использовать его в сеансе, поэтому он не звучит так, как будто он вам действительно нужен.

Приведенная выше ссылка (раздел 13.4) дает пример (который я изменил в соответствии с вашими терминами):

IList placements = sess.CreateCriteria(typeof(Placement))
                 .CreateAlias("PlacementSupervisor", "sup")
                 .Add( Expression.EqProperty("sup.supervisorId", criteria.SupervisorId") )
                 .Add( Expression.EqProperty("sup.supervisorTypeId", criteria.SupervisorTypeId) )
                 .List();

Несколько других примечаний:

  1. Я бы не беспокоился о ФК.Пока вы сопоставили отношения, NH может выяснить, как выполнить объединение.
  2. Имена свойств чувствительны к регистру, я думаю, что попробуйте сделать это также с "sup.SupervisorId".
  3. Убедитесь, что вы используете имя свойства, а не имя столбца БД.
0 голосов
/ 28 февраля 2011

В итоге я смог использовать модифицированный код сверху.

  query.CreateCriteria("Supervisors")  
      .Add(Restrictions.Eq("SupervisorId", (int)criteria.SupervisorId))
      .Add(Restrictions.Eq("SupervisorType.SupervisorTypeId", criteria.SupervisorTypeId));

С Супервизорами, являющимися собственностью в моем классе модели размещения.

Обратите внимание также, что выражения были почти не рекомендованы Ограничениями.

...