Как обратиться к значениям перечисления в спецификации отображения формул nhibernate? - PullRequest
1 голос
/ 12 марта 2010

У меня есть два типа сущностей:

  • Тип родительской сущности RunContainer
  • Запустить дочерний тип сущности

Run имеет свойство Status, которое имеет тип RunStatus, например:

public enum RunStatus
{
  Created,
  Starting,
  // ...
}
public class Run
{
  public int ContainerId { get; private set; }
  // ...
  public RunStatus Status { get; private set; }
}

RunContainer имеет вычисляемое свойство ActiveRunCount, например:

public class RunContainer
{
  public int Id { get; private set; }
  // ...
  public int ActiveRunCount { get; private set; }
}

В отображении для свойства RunContainer.ActiveRunCount я использую формулу спецификации следующим образом:

<property name="ActiveRunCount" formula="(select count(r.Id) from Run r where r.ContainerId = Id and r.Status = 1)"/>

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

Спасибо.

1 Ответ

1 голос
/ 07 апреля 2010

NHibernate сопоставляет перечисления со строковым представлением, если столбец SQL является строковым типом, и это значение по умолчанию, если вы разрешаете NHibernate генерировать схему.

так:

ALTER TABLE Run ALTER COLUMN Status varchar(20)

и в отображении

<class name="Run">
  <!- [...] -->
  <property name="Status"/>
</class>

Теперь таблица SQL будет содержать строковое представление перечисления. Теперь формула может запросить ее:

<property name="ActiveRunCount" formula="
  (select count(r.Id) from Run r 
  where r.ContainerId=Id and r.Status='Active')"/>

(Если у вас уже есть данные в таблицах, вы должны написать преобразование вместо простого оператора ALTER COLUMN).


РЕДАКТИРОВАТЬ после комментария:

Чтобы сгенерировать файл сопоставления и убедиться, что в формуле указано правильное значение enum, вы можете использовать FluentNhibernate . Сопоставление для свойства ActiveRun будет выглядеть следующим образом:

Map(x => x.ActiveRunCount)
 .Formula(string.Format("(select count(r.Id) [...] and r.Status='{0}')",
   RunStatus.Active))

Если это то, что вы искали, вы также можете оставить целые числа в столбцах и сделать это:

Map(x => x.ActiveRunCount)
 .Formula(string.Format("(select count(r.Id) [...] and r.Status={0})",
   (int)RunStatus.Active))
...