如何使用NHibernate持久枚举

有没有办法使用NHibernate持久枚举数据库? 这是有一个表中的代码和枚举中的每个值的名称。

我想保持枚举没有一个实体,但仍然有一个外键(枚举的int表示)从所有其他引用实体枚举的表。

你们为什么这么复杂呢? 这真的很简单。

映射如下所示:

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

模型属性如下所示:

 public virtual OrganizationTypes OrganizationType { get; set; } 

Enum看起来像这样:

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

NHibernate会自动把它全部弄清楚。 为什么input比你需要?

您可以直接使用枚举types: http ://web.archive.org/web/20100225131716/http: //graysmatter.codivation.com/post/Justice-Grays-NHibernate-War-Stories-Dont-Use-Int- If-You-Mean-Enum.aspx 。 如果你的基础types是一个string,它应该使用string表示forms,如果它是数字的,它将只使用数字表示forms。

但是,你的问题措辞听起来像你正在寻找不同的东西,而不是一个枚举。 看起来你想要一个查找表而不创build一个单独的实体类。 我不认为这可以做,但不创build一个单独的实体类。

一个简单但不是很漂亮的解决scheme:

创build一个整数字段并将映射文件中的映射设置为该字段。 创build一个使用整数字段的公共属性。

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

我使用的是NHibernate 3.2,这很好用:

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

但是,不知道什么时候添加了genericsEnumStringType。

尝试使用stategy模式。 然后,你可以把逻辑放到你的内部类中。 当“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 } 

据我所知,这是不可能的默认情况下。 不过,Google在NHibernate Enum上提出了一些有趣的结果。 我可能会尝试的方法之一是Oran Dennison的genericsNHibernate枚举string映射 ,或者,如果您可以修改NHibernate Forge中描述的Enum, Persisiting Described Enums 。