2010-03-12 90 views
1

我有两个实体类型:如何引用nhibernate公式映射规范中的枚举值?

  • RunContainer父实体类型
  • 运行子实体类型

运行有一个属性状态,其类型为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

如果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)) 
+0

嗨。我们的模式是手动创建的,所以这个字段是一个smallint。但是,假设它是一个字符串。 NHibernate是否验证给定的字符串实际上表示来自各自枚举类型的现有值? – mark 2010-04-07 06:50:15

+0

如果数据库列中的字符串与枚举中的值不匹配,则NHibernate会引发异常。然而,该公式是一个SQL语句,并未以此方式进行验证 - nhibernate只会将该语句复制到生成的SQL中。如果你想确保你有一个有效的字符串,你应该使用其他映射方式来生成映射XML,比如流畅映射。通过流畅的映射,您可以使用代码来定义映射。我会在我的答案中添加一个例子。 – 2010-04-07 07:28:07

+0

谢谢。这太糟糕了,核心NHibernate不允许这样做。 – mark 2010-04-08 08:41:27