如何在nhibernate公式映射规范中引用枚举值?

如何在nhibernate公式映射规范中引用枚举值?,nhibernate,nhibernate-mapping,enums,formula,Nhibernate,Nhibernate Mapping,Enums,Formula,我有两种实体类型: RunContainer父实体类型 运行子实体类型 Run有一个属性状态,其类型为RunStatus,如下所示: public enum RunStatus { Created, Starting, // ... } public class Run { public int ContainerId { get; private set; } // ... public RunStatus Status { get; private set; }

我有两种实体类型:

  • RunContainer父实体类型
  • 运行子实体类型
Run有一个属性状态,其类型为RunStatus,如下所示:

public enum RunStatus
{
  Created,
  Starting,
  // ...
}
public class Run
{
  public int ContainerId { get; private set; }
  // ...
  public RunStatus Status { get; private set; }
}
public class RunContainer
{
  public int Id { get; private set; }
  // ...
  public int ActiveRunCount { get; private set; }
}
RunContainer有一个计算属性ActiveRunCount,如下所示:

public enum RunStatus
{
  Created,
  Starting,
  // ...
}
public class Run
{
  public int ContainerId { get; private set; }
  // ...
  public RunStatus Status { get; private set; }
}
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枚举值,而不是相应的符号名。有人能告诉我如何使用符号名吗


谢谢。

如果SQL列是字符串类型,NHibernate会将枚举映射到字符串表示,如果让NHibernate生成架构,这是默认值

因此:

在地图上

<class name="Run">
  <!- [...] -->
  <property name="Status"/>
</class>
如果这就是您要查找的,您还可以在列中保留整数,并执行以下操作:

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

如果SQL列是字符串类型,则NHibernate将枚举映射到字符串表示,如果让NHibernate生成架构,则这是默认值

因此:

在地图上

<class name="Run">
  <!- [...] -->
  <property name="Status"/>
</class>
如果这就是您要查找的,您还可以在列中保留整数,并执行以下操作:

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

你好我们的模式是手动创建的,因此字段是smallint。但假设它是一根绳子。NHibernate是否验证给定字符串是否实际表示相应枚举类型中的现有值?如果数据库列中的字符串与枚举中的值不匹配,NHibernate将引发异常。然而,该公式是一个SQL语句,并没有以这种方式进行验证——nhibernate只会将该语句复制到生成的SQL中。如果您想确保那里有一个有效的字符串,那么应该使用其他生成映射XML的映射方法,比如fluent映射。使用fluent映射,您可以使用代码定义映射。我会在回答中加上一个例子。谢谢。太糟糕了,核心NHibernate不允许这样做。嗨。我们的模式是手动创建的,因此字段是smallint。但假设它是一根绳子。NHibernate是否验证给定字符串是否实际表示相应枚举类型中的现有值?如果数据库列中的字符串与枚举中的值不匹配,NHibernate将引发异常。然而,该公式是一个SQL语句,并没有以这种方式进行验证——nhibernate只会将该语句复制到生成的SQL中。如果您想确保那里有一个有效的字符串,那么应该使用其他生成映射XML的映射方法,比如fluent映射。使用fluent映射,您可以使用代码定义映射。我会在回答中加上一个例子。谢谢。太糟糕了,核心NHibernate不允许这样做。