2009-02-03 6 views
1

Мне нужна рука, отображающая коллекцию.NHibernate Bag Mapping

Я использую таблицу соединений, чтобы удерживать ссылки на идентификаторы номеров и идентификаторы calEvent. Тем не менее, поисковые запросы будут в основном базироваться на номере buildingID, поэтому я хотел бы добавить buildingID в следующее сопоставление. Кто-нибудь знает, как это сделать?

Я просмотрел документы NHibernate, но ничего не могу найти.

<bag name="rooms" table="tb_calEvent_rooms" lazy="false"> 
    <key column="calEventID"/> 
    <many-to-many class="BasicRoom" column="roomID"/> 
</bag> 

Класс:

public class BasicRoom 
{ 
    private long _id; 
    private long _buildingID; 
    private string _roomName; 

Любые намеки/помощь очень высокую оценку.

Рассуждение:

Комната никогда не изменится здание так, если добавить buildingID к таблице присоединиться; я уменьшить сложность выбора заявления от чего-то вроде -

SELECT * 
FROM 
    dbo.tb_calEvent_rooms 
    INNER JOIN dbo.tb_calEvents ON (dbo.tb_calEvent_rooms.calEventID = dbo.tb_calEvents.id) 
    INNER JOIN dbo.tb_rooms ON (dbo.tb_calEvent_rooms.roomID = dbo.tb_rooms.id) 
    INNER JOIN dbo.tb_buildings ON (dbo.tb_rooms.buildingID = dbo.tb_buildings.id) 
WHERE 
    dbo.tb_buildings.id = 54 

Для

SELECT * 
FROM 
    dbo.tb_calEvents 
    INNER JOIN dbo.tb_calEvent_rooms ON (dbo.tb_calEvents.id = dbo.tb_calEvent_rooms.calEventID), 
    dbo.tb_buildings 
WHERE 
    dbo.tb_buildings.id = 54 

ли мои рассуждения правильно?

ответ

1

Удалить атрибут column из many-to-many элемента и добавить его в качестве INSEAD ребенка узла, наряду с дополнительным column элемента ссылки buildingID:

<bag name="rooms" table="tb_calEvent_rooms" lazy="false"> 
    <key column="calEventID"/> 
    <many-to-many class="BasicRoom"> 
    <column name="roomID"/> 
    <column name="buildingID"/> 
    </many-to-many> 
</bag> 

Это должно позволить вам запрос, основанный на buildingID, а также roomID.

+0

Спасибо за это, Я получаю следующее сообщение об ошибке. faultString = "Внешний ключ (FK3EDE57A96B977B0C: tb_calEvent_rooms [roomID, buildingID])) должен иметь такое же количество столбцов, что и ссылочный первичный ключ (tb_rooms [id])" Я предполагаю, что неправильное отображение номера или здания. Hmmmmm .. – user17510

+0

Да, вам нужно будет включить оба столбца в качестве PK в таблице с ссылками. –