Отдельная таблица для объектов-значений в NHibernate - PullRequest
4 голосов
/ 26 августа 2009

Я новичок в DDD и NHibernate.

В моем текущем проекте у меня есть объект Person, который содержит объект значения, скажем, Address. Сегодня это нормально. Но, возможно, однажды у меня будет требование, чтобы мой объект значения (в данном случае Address) должен был стать сущностью.

Прежде чем пытаться смоделировать это по методу DDD, в более ориентированном на данные подходе у меня была таблица Person с Id и другая таблица Address, чей PK был фактически FK, это был Id Персона (то есть отношения один-к-одному).

Я читал, что когда я сопоставляю объект-значение как компонент, его значение будет отображаться в виде столбцов в моей таблице сущностей (поэтому у меня не будет отношения один-к-одному).

Моя идея заключалась в том, что при необходимости я просто добавлял суррогатный ключ в свою таблицу адресов, и тогда он становился сущностью.

Как мне спроектировать это с помощью NHibernate? Должен ли я уже сделать свой объект Address сущностью?

Извините, я даже не знаю, понятны ли мои вопросы, я действительно здесь потерян.

Ответы [ 2 ]

4 голосов
/ 26 августа 2009

В системе, которую мы строим, мы помещаем Value-Objects в отдельные таблицы. Насколько я знаю, NHibernate требует, чтобы id был добавлен к объекту, но мы игнорируем это и рассматриваем объект как Value-Object в системе. Как вы, вероятно, знаете, Value-Object - это объект, который вам не нужно отслеживать, поэтому мы просто пропускаем id в объекте. Это позволяет нам свободнее моделировать базу данных так, как мы хотим, и моделировать модель домена так, как мы хотим.

0 голосов
/ 07 мая 2015

Вы можете присоединиться и сделать его Компонентом, позволяющим nHibernate отобразить его как объект правильного значения вместо сущности.

Таким образом, вам не понадобятся ни виртуальные свойства, ни пустой защищенный ctor (он может быть закрытым).

Join("PROPOSAL_PRODUCT", product =>
{
    product.Schema(IsaSchema.PROPOSALOWN);
    product.KeyColumn("PROPOSAL_ID");

    product.Component(Reveal.Member<Proposal, Product>("_product"), proposalProduct =>
    {
        proposalProduct.Map...
    });
});
...