Свободные NHibernate и вычислительные свойства - PullRequest
4 голосов
/ 05 марта 2010

Я использую Fluent NHibernate и автоматически отображаю классы.

У меня есть вычисляемое свойство в классе, аналогичное

public virtual DateTime? LastActionTimeStamp
{
    get {
        return Actions.Count == 0 ? null : Actions.OrderByDescending(
            a => a.TimeStamp).ElementAt(0).TimeStamp;
    }
}

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

не удалось выполнить запрос ... Неверное имя столбца 'LastActionTimeStamp'.

Итак, мой вопрос: как я могу сказать Fluent NHibernate, чтобы он приказал NHibernate игнорировать базу данных для этого свойства, но при этом возвращать вычисленное значение из свойства get?

Ответы [ 3 ]

2 голосов
/ 05 марта 2010

Вы можете связать формулу со свойством и использовать ее вместо кода c #. например,

Свойство:

private int _postCount = 0;
public virtual int PostCount
{
    get
    {
        return _postCount;
    }
}

Формула:

(SELECT count(p.ID) FROM BlogPost p WHERE p.BlogID = ID and p.IsDeleted = 0)

И тогда вы можете использовать PostCount в своем выражении как обычно. Не забудьте установить модификатор доступа для свойства в вашем FluentMapping. Не уверен, что поддерживает Fluent, но я нашел варианты для нормального отображения:

* property
* field
* field.camelcase
* field.camelcase-underscore
* field.pascalcase-m-underscore
* field.lowercase-underscore
* nosetter.camelcase
* nosetter.camelcase-underscore
* nosetter.pascalcase-m-underscore
* nosetter.lowercase-underscore

Вероятно, лучше всего проверить документацию NHibernate для официального списка Стратегии доступа , поэтому вы комбинируете стратегию доступа со стратегией именования, например, "Field.lowercase-подчеркивание"

1 голос
/ 18 января 2011

Вы также можете переопределить отображение и игнорировать свойства:

public class ThatClassMappingOverride : IAutoMappingOverride<ThatClass>
{
  public void Override(AutoMapping<ThatClass> mapping)
        {
            mapping.IgnoreProperty(x=> x.PropertyToIgnore);
        }
}
1 голос
/ 05 марта 2010

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

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

В вашей настройке автоматического преобразования создайте override и сопоставьте это свойство явно, используя свойство Access, чтобы сообщить NHibernate, как его обрабатывать.

Примерно так:

AutoMap.AssemblyOf<YourEntity>()
  // automapping stuff
  .Override<ThatClass>(m =>
  {
    m.Map(x => x.LastActionTimeStamp)
      .Access.None();
  });
...