我是NHibernate的新手 - 它在我尝试将其应用于我们在工作中使用的Oracle 10g数据库中的一种更常见的构造之前一直很有效。
我想拥有一个域对象,如下所示:
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 :(得分: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列的PK ID之间的外键约束。在我上面的xml中,我认为你最终会得到一个SentEmailHistory对象的两个ID。
我确信Hibernate专家可以告诉你更多,但Hibernate在如何允许你采用现有的表结构方面非常灵活。这个StackOverflow question也可能会有所帮助。
答案 1 :(得分:0)
经过几周的努力,我觉得我已经确定NHibernate不可能做到这一点。我决定重写我的类或提供一次性映射包装来处理请求。
如果其他人想出解决方案,请告诉我。