NHibernate сопоставляет свойство столбцу в другой таблице - PullRequest
0 голосов
/ 22 мая 2011

Я новичок в 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)

Я не хочу каким-либо образом изменять свой код только потому, чтоВ базе данных выложена дополнительная таблица, в которой мой код отсутствует;Я не верю, что «адрес электронной почты» оправдывает другую сущность домена.

Если возможно, я бы предпочел обновлять только свои отображения гибернации.В противном случае, есть ли какие-нибудь ненавязчивые обновления, которые могут быть сделаны к базе данных?

Обновление

Из того, что я видел, синтаксис соединения не будет действительно поддерживать то, что я делаю, особенно при использовании существующих адресов электронной почты, которые должны быть найденыв таблице EMAIL_ADDR, которую я описал выше.Могу ли я предоставить необработанные запросы вставки / обновления в NHibernate?Или, возможно, единственный способ - это обновляемый вид?

Ответы [ 2 ]

1 голос
/ 22 мая 2011

Да, это поддерживается использованием элемента "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>

Часть, в которой я не уверен, заключается в том, как обеспечить ограничение внешнего ключа между идентификатором PK таблицы SEND_EMAIL_HIST и столбца EMAIL_ADDR. Я думаю, что в моем приведенном выше XML-коде вы получите два идентификатора для одного объекта SentEmailHistory.

Я уверен, что эксперт Hibernate может рассказать вам больше, но Hibernate довольно гибок в том, как он позволяет адаптироваться к существующим структурам таблиц. Этот вопрос StackOverflow также может помочь.

0 голосов
/ 03 июня 2011

После нескольких недель борьбы с этим я чувствую, что смело установил, что это невозможно в NHibernate.Я решил либо переписать свои классы, либо предоставить одноразовую упаковочную карту для обработки запросов.

Если кто-то еще придумает решение, пожалуйста, дайте мне знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...