我有两种实体类型:
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枚举值。任何人都可以告诉我如何使用符号名称?
感谢。
答案 0 :(得分: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))