有没有办法使用NHibernate将枚举持久保存到数据库?这是一个包含代码和枚举中每个值的名称的表。
我想保留没有实体的枚举,但仍然有一个外键(枚举的int表示)从所有其他引用实体到枚举表。
答案 0 :(得分:107)
你们为什么要过于复杂?这很简单。
映射如下所示:
<property name="OrganizationType"></property>
模型属性如下所示:
public virtual OrganizationTypes OrganizationType { get; set; }
Enum看起来像这样:
public enum OrganizationTypes
{
NonProfit = 1,
ForProfit = 2
}
NHibernate会自动解决这个问题。为什么打字超过你需要????
答案 1 :(得分: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。如果你的底层类型是一个字符串,它应该使用字符串表示,如果它是数字,它将只使用数字表示。
但你的问题措辞听起来像是在寻找不同的东西,而不是一个枚举。您似乎想要一个查找表而不创建单独的实体类。我不认为这可以在不创建单独的实体类的情况下完成。
答案 2 :(得分:6)
一个简单但不那么漂亮的解决方案:
创建一个整数字段,并将映射文件中的映射设置为该字段。 创建一个使用整数字段的公共属性。
private int myField;
public virtual MyEnum MyProperty
{
get { return (MyEnum)myField; }
set { myField = value; }
}
答案 3 :(得分:4)
我正在使用NHibernate 3.2,这很有效:
type="NHibernate.Type.EnumStringType`1[[enum_full_type_name, enum_assembly]], NHibernate"
不确定何时添加了通用的EnumStringType。
答案 4 :(得分:2)
尝试使用状态模式。然后,您可以将逻辑放入内部类中。当存在应该包含在“枚举”中的逻辑时,我特别使用它。例如,下面的代码具有抽象的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
}