2011-05-22 114 views
0

我是NHibernate的全新功能 - 直到我尝试将它应用于我们在工作中使用的Oracle 10g数据库中的一个更常见的构造时,它才运行良好。NHibernate将一个属性映射到另一个表中的列

我想有一个域对象如下:

public class SentEmailHistory 
{ 
    public virtual int Id { get; set; } 
    public virtual string EmailAddress { get; set; } 
    ... 
} 

我与实际上看起来像使用的数据库如下:

SEND_EMAIL_HIST 
================ 
SEND_EMAIL_HIST_ID (PK) 
EMAIL_ADDR_ID (FK to EMAIL_ADDR) 
... 

EMAIL_ADDR 
============ 
EMAIL_ADDR_ID (PK) 
EMAIL_ADDR (AK1) 

我不希望有改变我的代码任何方式只是因为数据库拆分了我的代码没有附加的表;我不相信“电子邮件地址”证明另一个域名实体是正当的。

如果可能,我宁愿只更新我的hibernate映射。否则,是否可以对数据库进行任何非强制更新?

更新

从我所看到的,联接语法不会真的支持我在做什么,使用应该在我上述EMAIL_ADDR表中找到现有的电子邮件地址时尤其如此。我可以向NHibernate提供原始插入/更新查询吗?或者也许是可更新的观点唯一的出路?

回答

0

经过几周的努力,我觉得我已经安全地确定这在NHibernate中是不可能的。我决定重写我的类或提供一次性映射包装来处理请求。

如果有人想出解决方案,请告诉我。

1

是的,这通过使用“join”元素来支持。有关更多信息,请参阅http://ayende.com/blog/3961/nhibernate-mapping-join。它可能看起来像下面这样:

<class name="SentEmailHistory" 
table="SEND_EMAIL_HIST"> 

<id name="Id"> 
    <generator class="identity"/> 
</id> 
<join table="EMAIL_ADDR"> 
    <key column="EMAIL_ADDR_ID"/> 
    <property name="EMAIL_ADDR"/> 
</join> 
</class> 

这件作品,我不知道你是怎么保证SEND_EMAIL_HIST表的PK ID,而且EMAIL_ADDR柱之间的外键约束。在我上面的xml中,我想最终会得到一个SentEmailHistory对象的两个ID。

我确定Hibernate专家可以告诉你更多,但Hibernate在如何让你采用现有表结构方面非常灵活。 StackOverflow question也可能有所帮助。

+0

嗯,这不是我想要的。对不起,通过离开“SentEmailHistory”的PK,我可能引起了混淆。我会更新我的答案。不过谢谢! – 2011-05-22 15:18:30

+0

谢谢你这个问题 - 似乎是一个类似的问题。我也同意“在大多数情况下,你的对象模型应该比数据库模型更细粒度”,但在这种情况下,存储一个字符串的对象感觉有点极端。 – 2011-05-22 15:43:41

相关问题