2009-02-23 62 views
1

我正在使用Oracle中的遺留數據庫,並且我的一些表中有一些列設置爲NOT-NULL,我不希望在我的域模型中使用該列,但顯然,我需要指定某處至少有一些默認值被保存到數據庫中(例如,組表可能有一個「縮進」列,總是期望一個char(8)值)。未映射的NHibernate中的列?

我該如何在NHibernate中做這件事?是否有捷徑可尋?如果沒有,有誰知道我可以做到這一點的方式(我曾考慮過使用Inteceptor,但真的不知道從哪裏開始......)。我無法更改數據庫模式,因此,不幸的是,這不是一個選項(流暢的版本也沒關係......)。

回答

5

如果你不想污染您波蘇斯,一個攔截器可能是最好的選擇。看看有關攔截器的各種文章,如this one。請確保在OnFlushDirty方法(OnFlushDirty是「update」)中使用currentState [],並在狀態[]中使用currentState []。 OnSave方法(「插入」)。例如(的OnSave):

if (entity is Group) 
{ 
    state[Array.IndexOf(propertyNames, "Indentation")] = "dummy value"; 
    return true; 
} 
return false; 

編輯:

你試圖插入不會在您的域,而是由你的數據庫模型所需的數據,所以上述不完全工作爲你。相反,您必須爲每個state,propertyNames和types數組添加一個元素。

+0

但是,這不是假設對象上有一個「縮進」屬性,這正是我不想要的嗎? – 2009-02-24 09:34:40

+0

你是對的。我將編輯我的帖子。 – 2009-02-24 13:18:27

1

,你可以用custom CRUD sql去,在Java中我會說有默認值的私人二傳手的屬性將工作太

+0

這也適用於.Net。您可以使用具有默認值的私人字段,並將其與進行映射。 – 2009-02-24 23:47:45

0

我一直以爲這樣的問題最好用指定的列的默認值解決。

這樣你就可以忘記它,而不是實現一些攔截器,它甚至聽起來很可怕。

繼承人樣本SQL代碼:alter table with default value

我猜測,即使DB是傳統的,你有一些控制權,因爲你可以插入新行。這是非常便宜和輕量級的解決方案。