2010-03-12 103 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