有没有办法使用NHibernate将枚举持久化到数据库?这是一个包含代码和枚举中每个值的名称的表。如何使用NHibernate持久枚举
我想保留没有实体的枚举,但仍然有一个外键(enum的int表示)从所有其他引用实体到枚举的表中。
有没有办法使用NHibernate将枚举持久化到数据库?这是一个包含代码和枚举中每个值的名称的表。如何使用NHibernate持久枚举
我想保留没有实体的枚举,但仍然有一个外键(enum的int表示)从所有其他引用实体到枚举的表中。
据我所知,这是默认情况下不可能的。但是,Google在NHibernate Enum上提出了一些有趣的结果。我可能会尝试的方法之一是Oran Dennison's Generic NHibernate Enum String Mapping,或者,如果您可以修改NHibernate Forge中所述的Enum,Persisiting Described Enums。
谢谢,但是这都是指枚举的字符串,我想在int表示本身有一个外键。 – 2008-11-02 15:50:20
一个简单但不是很漂亮的解决方案:
创建整型字段,并设置在映射文件到外地的映射。 创建使用整数字段的公共属性。
private int myField;
public virtual MyEnum MyProperty
{
get { return (MyEnum)myField; }
set { myField = value; }
}
您可以直接使用枚举类型:http://web.archive.org/web/20100225131716/http://graysmatter.codivation.com/post/Justice-Grays-NHibernate-War-Stories-Dont-Use-Int-If-You-Mean-Enum.aspx。如果您的基础类型是一个字符串,它应该使用字符串表示形式,如果它是数字形式,它将只使用数字表示形式。
但是你的问题措辞听起来像你正在寻找不同的东西,而不是一个枚举。看起来你想要一个查找表而不创建一个单独的实体类。我不认为这可以通过创建一个单独的实体类来完成。
该链接似乎不起作用。这应该: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
尝试使用状态模式。然后你可以把逻辑放到你的内部类中。当“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
}
你们为什么这么复杂呢?这非常简单。
的映射是这样的:
<property name="OrganizationType"></property>
的模型属性如下:
public virtual OrganizationTypes OrganizationType { get; set; }
枚举看起来是这样的:
public enum OrganizationTypes
{
NonProfit = 1,
ForProfit = 2
}
的NHibernate会自动算出它的所有出。为什么输入比你需要的更多?
我使用NHibernate 3.2,而这个伟大的工程:
type="NHibernate.Type.EnumStringType`1[[enum_full_type_name, enum_assembly]], NHibernate"
不知道什么时候得到了补充通用EnumStringType,虽然。
确实解决了您的问题吗? – UpTheCreek 2010-05-09 15:35:27
@Sosh,不,对于重要的枚举我已经推出了一个实体,其他人我只是使用int值。 – 2010-05-10 15:24:32