2009-02-23 42 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是传统的,你有一些控制权,因为你可以插入新行。这是非常便宜和轻量级的解决方案。