2008-11-02 40 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,虽然。