Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> <composite-id>, NHibernate  
:(
    Опции темы
MFSham
  Дата 12.3.2008, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 28.8.2005
Где: Беларусь, Гродно

Репутация: нет
Всего: 3



Есть таблица "Departaments" и таблица "Subjects". 

На каждом их факультетов может быть любой предмет, и соответственно, любой предмет может быть на каждом из факультетов. Получается связь многие ко многим. Для этого есть еще одна таблица "RelationSubDep", полями которой являются соответственно id_Departament и id_Subject. Оба поля образуюст составной ключ. Диаграмма таблицы прикреплена.

Вот код RelationSubDep.hbm.xml
Код

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="TestProject.HbmFiles" assembly="TestProject">
    <class name="RelationSubDep" table="RelationSubDep">
        <composite-id class="RelationSubDep">
            <key-many-to-one name="Departament" class="TestProject.HbmFiles.Departaments" column="id_Departament" />        
            <key-many-to-one name="Subject" class="TestProject.HbmFiles.Subjects" column="id_Subject"/>
        </composite-id>        
    </class>
</hibernate-mapping>


RelationSubDep.cs
Код

using System;

namespace TestProject.HbmFiles {
    [Serializable]
    public class RelationSubDep {
        #region Fields

        //
        private Departaments m_departament;
        private Subjects m_subject;

        #endregion

        #region Ctor

        //
        public RelationSubDep() {}

        #endregion

        #region Properties

        //
        public virtual Departaments Departament {
            get { return this.m_departament; }
            set { this.m_departament = value; }
        }

        //        
        public virtual Subjects Subject {
            get { return this.m_subject; }
            set { this.m_subject = value; }
        }

        //
        public override bool Equals(object obj) {
            return base.Equals(obj);
        }

        //
        public override int GetHashCode() {
            return base.GetHashCode();
        }

        #endregion
    }
}


При таких настройках, если получать объект RelationSubDep, то он создается, но содержит все null данные. Понимаю что надо изменить RelationSubDep.hbm.xml. 
Насколько вычитал, что нужно еще чтобы таблица RelationSubDep содержала свой id, иначе не прокатит. Верно ли это?

Как правильно настроить RelationSubDep.hbm.xml с composite-id? smile

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  drgm.JPG 14,65 Kb
--------------------
Без ветра трава неподвижна. Без программ компьютеры бесполезны.
PM MAIL   Вверх
Veitmen
Дата 19.3.2008, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 10.11.2006
Где: СПБ

Репутация: нет
Всего: 4



Еще интересует этот вопрос?

Попробуй так 
Код
    
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="TestProject.HbmFiles" assembly="TestProject">
    <class name="RelationSubDep" table="RelationSubDep">
<id name="Id" type="Int32" unsaved-value="0" Column="ID">
            
</id>
            <many-to-one name="Departament" class="TestProject.HbmFiles.Departaments" column="id_Departament" />        
            <many-to-one name="Subject" class="TestProject.HbmFiles.Subjects" column="id_Subject"/>  
    </class>
</hibernate-mapping>


Т.е. Добавь ИД и просто нужные поля как внешние ключи
PM MAIL ICQ   Вверх
MFSham
Дата 19.3.2008, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 28.8.2005
Где: Беларусь, Гродно

Репутация: нет
Всего: 3



Цитата(Veitmen @  19.3.2008,  11:21 Найти цитируемый пост)
Еще интересует этот вопрос?

Конечно интересует smile
Цитата(Veitmen @  19.3.2008,  11:21 Найти цитируемый пост)
Т.е. Добавь ИД и просто нужные поля как внешние ключи 

Я так и сделал в конечном счете, но при такой реализации теряется уникальность id_Departament и id_Subject, т.к. получается что ID будет PK. 
Т.е. прокатит вариант(id, id_Departament, id_Subject) : (1, 2, 4) и допустим (2, 2, 4), что есть нехорошо.
--------------------
Без ветра трава неподвижна. Без программ компьютеры бесполезны.
PM MAIL   Вверх
Veitmen
Дата 19.3.2008, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 10.11.2006
Где: СПБ

Репутация: нет
Всего: 4



Проиндексируй\сделай ключами в бд эти поля. В маппинге не указывай что это ключи. Тебе будет генерится ошибка на уровне бд. Лови и все.
PM MAIL ICQ   Вверх
ivashkanet
Дата 20.3.2008, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 4
Всего: 149



Цитата(MFSham @  19.3.2008,  18:29 Найти цитируемый пост)
Т.е. прокатит вариант(id, id_Departament, id_Subject) : (1, 2, 4) и допустим (2, 2, 4), что есть нехорошо.

Добавь constraint:
Код

ALTER TABLE  RelationSubDep
    ADD CONSTRAINT CK_RELATION_SUB_DEP_SK UNIQUE(Departament, Subject)

PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0667 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.