Отображение NHibernate после нормализации

Пожалуйста, помогите мне - я новичок в NHibernate и не могу найти то, что ищу.

У меня есть две таблицы в базе данных: Fund и FundBalance. У Fund может быть много FundBalances, а у FundBalance только один Fund.

В C # есть только класс FundBalance. Столбцы из таблицы Fund, соединенные со столбцами из таблицы FundBalance, необходимо сопоставить со свойствами класса FundBalance.

Например, таблица Fund содержит свойство FundName, а таблица FundBalance содержит свойство AvailableBalance. Эти две таблицы объединяются, и результат объединения необходимо сопоставить со свойствами FundName и AvailableBalance в классе FundBalance.

Вопрос: как мне это сделать с NHibernate? Бонус: как указать сопоставление с помощью FluentNHibernate?

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


person Sir Rippov the Maple    schedule 26.02.2009    source источник
comment
Что входит в класс FundBalance из данных, поступающих из таблицы FundBalance, поскольку у фонда может быть несколько FundBalance? Тогда как выглядит ваш класс FundBalance и что именно в нем входит?   -  person Frederik Gheysels    schedule 07.03.2009


Ответы (6)


Как я просил в комментариях; как именно выглядит этот класс FundBalance? Что там происходит? Можете ли вы что-нибудь сделать с элементом <join table> в отображении NHibernate?

Например: http://ayende.com/Blog/archive/2007/04/24/Multi-Table-Entities-in-NHibernate.aspx

person Frederik Gheysels    schedule 06.03.2009

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

Попробуй это:

<class name="FundBalance" table="FundBalance" lazy="true">
        <id name="Id" column="FundBalanceId" unsaved-value="0">
            <generator class="native"/>
        </id>

        <property name="FundBalance" not-null="true" length="80"/>

        <join table="Fund">
            <key column="FundId"/>
            <property name="FundName"/>
        </join>
</class>

Для вашего класса сущности FundBalance код будет следующим:

public class FundBalance
{   
        private long _Id;
        public virtual long Id
        {
            get { return _Id; }
            set { _Id = value; }
        }

        private decimal _FundBalance;
        public virtual decimal FundBalance
        {
            get { return _FundBalance; }
            set { _FundBalance= value; }
        }

        private string _FundName;
        public virtual string FundName
        {
            get { return _FundName; }
            set { _FundName= value; }
        }
}

Если вам нужно больше примеров и объяснений проблем сопоставления нескольких таблиц для одного enties, попробуйте эти ссылки:

https://svn.sourceforge.net/svnroot/nhibernate/trunk/nhibernate/src/NHibernate.Test/Join/ http://ayende.com/Blog/archive/2007/04/24/Multi-Table-Entities-in-NHibernate.aspx

Я даю вам сопоставленные файлы HBM, для свободного использования nhibernate я не знаю, можете ли вы использовать ключевые слова JOIN, но, по сути, это та же проблема.

Надеюсь это поможет.

person alexl    schedule 09.03.2009

В чем причина того, что у вас нет класса Fund? Я бы еще раз подумал, действительно ли это разумно.

Но если вы хотите остаться на этом маршруте, может помочь атрибут подзапроса (извините, у меня это из документов Hibernate, а не NHibernate, но я надеюсь, что они достаточно похожи: http://www.hibernate.org/)hib_docs/core/reference/en/html_single/#mapping-декларация-класс)

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

Альтернативой может быть (как вы сами упомянули) создание представления в базе данных и использование «вместо триггера», если ваша база данных поддерживает это.

person Jens Schauder    schedule 26.02.2009
comment
Спасибо, Йенс. Просто чтобы ответить на вопрос, который вы задали в своем ответе - у нас нет класса Fund, потому что мы делимся нашими сущностями с унаследованной системой. Я не буду вдаваться в подробности почему, но мы должны делиться сущностями. - person Sir Rippov the Maple; 27.02.2009
comment
почему бы вам не сделать свою систему для использования отдельных классов fund и fundBalance, кажется, что это правильная модель предметной области, а затем создать отдельный интерфейс для устаревшей системы. таким образом вы останетесь в здравом уме позже, когда будете строить свою систему на основе этих классов. - person zappan; 08.03.2009

Почему бы вам не использовать узор фасада, если все, что вам нужно, - это общий класс для обеих таблиц? Сопоставьте Fund и FundBalance обычно, создайте (не сопоставленный) новый класс в качестве интерфейса для обеих сущностей. Просто и без «магии».

person user68660    schedule 27.02.2009

Если вам нужно только читать, а не писать в Фонд, вы можете использовать формулу. Например:

Таким образом, вы сможете работать с FundBalances как обычно, но не с Funds.

person Diego Jancic    schedule 06.03.2009

Это должно быть сделано с использованием поддержки Hibernates для наследования. Hibernate может моделировать семейства связанных классов несколькими способами, но один является таблицей для базового класса, а другой - для каждого подкласса, в котором хранятся их дополнительные свойства. При загрузке все столбцы автоматически загружаются в назначенный подкласс, поэтому создайте фальшивую структуру наследования только с одним классом, и он должен работать именно так, как вы описываете.

person Ewan Makepeace    schedule 05.03.2009
comment
это не имеет ничего общего с наследованием - person Frederik Gheysels; 07.03.2009