2008-11-02 60 views
52

有沒有辦法使用NHibernate將枚舉持久化到數據庫?這是一個包含代碼和枚舉中每個值的名稱的表。如何使用NHibernate持久枚舉

我想保留沒有實體的枚舉,但仍然有一個外鍵(enum的int表示)從所有其他引用實體到枚舉的表中。

+0

確實解決了您的問題嗎? – UpTheCreek 2010-05-09 15:35:27

+0

@Sosh,不,對於重要的枚舉我已經推出了一個實體,其他人我只是使用int值。 – 2010-05-10 15:24:32

回答

6

一個簡單但不是很漂亮的解決方案:

創建整型字段,並設置在映射文件到外地的映射。 創建使用整數字段的公共屬性。

private int myField; 
public virtual MyEnum MyProperty 
{ 
    get { return (MyEnum)myField; } 
    set { myField = value; } 
} 
13

您可以直接使用枚舉類型:http://web.archive.org/web/20100225131716/http://graysmatter.codivation.com/post/Justice-Grays-NHibernate-War-Stories-Dont-Use-Int-If-You-Mean-Enum.aspx。如果您的基礎類型是一個字符串,它應該使用字符串表示形式,如果它是數字形式,它將只使用數字表示形式。

但是你的問題措辭聽起來像你正在尋找不同的東西,而不是一個枚舉。看起來你想要一個查找表而不創建一個單獨的實體類。我不認爲這可以通過創建一個單獨的實體類來完成。

+1

該鏈接似乎不起作用。這應該:http://graysmatter.codivation.com/post/Justice-Grays-NHibernate-War-Stories-Dont-Use-Int-If-You-Mean-Enum。aspx – UpTheCreek 2009-11-16 17:32:14

2

嘗試使用狀態模式。然後你可以把邏輯放到你的內部類中。當「enum」中應該包含邏輯時,我非常明確地使用它。例如,下面的代碼具有抽象的IsReadyForSubmission(),然後在每個嵌套子類中實現(僅顯示一個)。 HTH

[Serializable] 
public abstract partial class TimesheetStatus : IHasIdentity<int> 
{ 
     public static readonly TimesheetStatus NotEntered = new NotEnteredTimesheetStatus(); 
     public static readonly TimesheetStatus Draft = new DraftTimesheetStatus(); 
     public static readonly TimesheetStatus Submitted = new SubmittedTimesheetStatus(); 
     //etc 

     public abstract int Id { get; protected set; } 
     public abstract string Description { get; protected set; } 
     public abstract bool IsReadyForSubmission(); 

     protected class NotEnteredTimesheetStatus: TimesheetStatus 
     { 
      private const string DESCRIPTION = "NotEntered"; 
      private const int ID = 0; 
      public override int Id 
      { 
       get { return ID; } 
       protected set { if (value != ID)throw new InvalidOperationException("ID for NotEnteredTimesheetStatus must be " + ID); } 
      } 

      public override string Description 
      { 
       get { return DESCRIPTION; } 
       protected set { if (value != DESCRIPTION)throw new InvalidOperationException("The description for NotEnteredTimesheetStatus must be " + DESCRIPTION); } 
      } 
      public override bool IsReadyForSubmission() 
      { 
       return false; 
      } 

     } 
     //etc 
} 
105

你們爲什麼這麼複雜呢?這非常簡單。

的映射是這樣的:

<property name="OrganizationType"></property> 

的模型屬性如下:

public virtual OrganizationTypes OrganizationType { get; set; } 

枚舉看起來是這樣的:

public enum OrganizationTypes 
{ 
    NonProfit = 1, 
    ForProfit = 2 
} 

的NHibernate會自動算出它的所有出。爲什麼輸入比你需要的更多?

3

我使用NHibernate 3.2,而這個偉大的工程:

type="NHibernate.Type.EnumStringType`1[[enum_full_type_name, enum_assembly]], NHibernate" 

不知道什麼時候得到了補充通用EnumStringType,雖然。