52

有没有办法使用 NHibernate 将枚举持久化到数据库?那就是有一个包含代码和枚举中每个值的名称的表。

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

4

5 回答 5

107

为什么你们把事情复杂化了?这真的很简单。

映射如下所示:

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

模型属性如下所示:

public virtual OrganizationTypes OrganizationType { get; set; }

枚举看起来像这样:

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

NHibernate 会自动解决所有问题。为什么打字比你需要的多????

于 2009-12-15T05:01:17.620 回答
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。如果您的基础类型是字符串,它应该使用字符串表示,如果它是数字,它将只使用数字表示。

但是您的问题措辞听起来像是您正在寻找不同的东西,而不是枚举。似乎您想要一个查找表而不创建单独的实体类。我不认为这可以在不创建单独的实体类的情况下完成。

于 2008-11-03T02:33:57.993 回答
6

一个简单但不那么漂亮的解决方案:

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

private int myField;
public virtual MyEnum MyProperty
{
   get { return (MyEnum)myField; }
   set { myField = value; }
}
于 2008-11-02T17:19:24.010 回答
4

我正在使用 NHibernate 3.2,这很好用:

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

不过,不确定何时添加了通用 EnumStringType。

于 2012-05-15T17:23:20.847 回答
2

尝试使用策略模式。然后,您可以将逻辑放入您的内部类中。当“枚举”中应该包含逻辑时,我会经常使用它。例如,下面的代码具有抽象 IsReadyForSubmission(),然后在每个嵌套子类中实现(仅显示一个)。高温高压

[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
}
于 2009-10-07T08:05:06.557 回答