NHibernate QueryOver и access = "field" члены - PullRequest
2 голосов
/ 02 февраля 2012

Допустим, у меня есть класс, который выглядит так:

public class User : Entity{
   public virtual string FullName{get;set;}
}

где Entity - очень простой базовый класс, который мы используем для привязки NHibernate:

public class Entity{
   public virtual int ID{
   {
      get{return id;}
   }

   private int id = 0;    
}

Если я хочу использовать QueryOver, который включает в себя идентификатор пользователя, как бы я это сделал, если привязать поле следующим образом:

<id name="id" column="UserID" access="field" unsaved-value="0">
            <generator class="identity" />
        </id>

Есть ли метод, который позволит мне получить доступ к полю в моем запросе? Если я попытаюсь использовать его с публичной собственностью, я знаю, что у меня возникнут проблемы с тем, что свойство фактически не связано с HBM.

Учитывая, что HQL может справиться с подобной ситуацией, мне любопытно, может ли QueryOver также.

В сторону: Я бы сказал, что ID должен быть публичной собственностью без вспомогательного поля и иметь частный установщик, но я опасаюсь делать такие радикальные изменения (этот шаблон повсюду в нашей области).

1 Ответ

1 голос
/ 02 февраля 2012

QueryOver (и LINQ) использует лямбда-выражения для ссылки на имена свойств, что означает, что правила видимости - это правила видимости C #.HQL и ICriteria используют строки, поэтому ограничений нет.

Если это только свойство ID, вы можете найти метод, который принимает лямбда-выражение для вашего свойства ID и возвращает ICriterion.(который QueryOver позволяет вам добавить к вашему запросу).

В качестве альтернативы, если вы можете поместить свои запросы в соответствующий класс (или как внутренний класс), то синтаксис C # должен позволить вам получить доступ к полю.

Это распространенное ограничение в API, которые используют лямбда-выражения.Вот некоторые соображения от команды FluentNHibernate, у которой, очевидно, есть те же ограничения:

http://wiki.fluentnhibernate.org/Fluent_mapping_private_properties

(я лично предпочитаю делать свои запросы внутренними классами).

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