有沒有辦法使用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