1

我有两种实体类型:

  • 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 枚举值。谁能告诉我如何改用符号名称?

谢谢。

4

1 回答 1

1

如果 SQL 列是字符串类型,NHibernate 将枚举映射到字符串表示,如果您让 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 语句)。


评论后编辑:

要生成映射文件并确保公式中的枚举值正确,您可以使用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))
于 2010-04-06T21:56:40.350 回答