NHibernate中未映射的列?

时间:2009-02-23 23:44:35

标签: nhibernate fluent-nhibernate nhibernate-mapping

我正在使用Oracle中的遗留数据库,并且我的一些表中的列设置为NOT-NULL,我不希望在我的域模型中使用,但显然,我需要在某处指定至少一些默认值保存到数据库中(例如,一个Groups表可能有一个“Indentation”列,thaqt总是需要一个char(8)值。)

我如何在NHibernate中解决这个问题?是否有捷径可寻?如果没有,有没有人知道我可以这样做的方式(我已经考虑过使用Inteceptor,但实际上不知道从哪里开始......)。我无法更改数据库架构,所以遗憾的是,这不是一个选项(流畅的版本也可以......)。

5 个答案:

答案 0 :(得分:5)

如果你不想污染你的POCO,拦截器可能是最好的选择。看一下有关拦截器的各种文章,比如this one

在您的拦截器上,您需要检查类型,以便知道将虚拟数据放入哪些字段。确保在OnFlushDirty方法中使用currentState [](OnFlushDirty为“update”)并在状态[]中使用OnSave方法(“插入”)。例如(OnSave):

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

编辑:

您正在尝试插入域中不存在但数据库模型需要的数据,因此上述内容对您来说并不适用。相反,您必须为每个state,propertyNames和types数组添加一个元素。

答案 1 :(得分:1)

你可以使用custom CRUD sql,在java中我会说一个私有的setter,该属性的默认值也会起作用

答案 2 :(得分:0)

NHibernate的答案是实施IInterceptor

答案 3 :(得分:0)

有一种使用IPropertyAccessor接口的替代方案 见http://elegantcode.com/2009/07/13/using-nhibernate-for-legacy-databases/

答案 4 :(得分:0)

我一直认为通过指定列的默认值可以最好地解决这类问题。

这样你就可以忘记它,而不是实现一些拦截器,这甚至听起来很可怕。

下载示例SQL代码:alter table with default value

我猜测即使DB是遗留的,你也可以控制它,因为你可以插入新的行。这是一种非常便宜且轻便的解决方案。