NHibernate Отображение многих ко многим с данными в таблице соединений - PullRequest
1 голос
/ 16 ноября 2010

У меня есть таблица User и таблица Address.Они связаны между собой таблицей соединений.Сопоставление для этого прямое, но у меня есть некоторые данные в таблице соединений, которые я хотел бы показать в таблице адресов.

Может быть, есть и лучший способ настроить это, что я 'm открыт для предложений по.

Вот структура таблицы.

CREATE TABLE [dbo].[User]
(
    [Id] INT NOT NULL IDENTITY PRIMARY KEY,
    ...
)

CREATE TABLE [dbo].[Address]
(
    [Id] INT NOT NULL IDENTITY PRIMARY KEY,
    ...
)

CREATE TABLE [dbo].[AddressType]
(
    [Id] INT NOT NULL IDENTITY PRIMARY KEY,
    [Name] NVARCHAR( 10 ) NOT NULL, -- Values: 'Shipping', 'Billing'
    ...
)

CREATE TABLE [dbo].[UserAddress]
(
    [UserId] INT NOT NULL FOREIGN KEY REFERENCES [dbo].[User]( [Id] ),
    [AddressId] INT NOT NULL FOREIGN KEY REFERENCES [dbo].[Address]( [Id] ),
    [AddressTypeId] INT NOT NULL FOREIGN KEY REFERENCES [dbo].[AddressType]( [Id] ),
    ...
)

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

Я изначально начал с двух таблиц соединения, BillingAddress и ShippingAddress, которые были просто соединениями между таблицами User и Address.Это бы хорошо работало, но тогда есть 2 таблицы с точно такой же структурой, которые делают то же самое, и это просто не выглядело правильно.

Ответы [ 2 ]

3 голосов
/ 16 ноября 2010

Если ваша таблица соединения (например, UserAddress) - это больше, чем просто пара внешних ключей, и в ней есть метаданные (например, AddressType), необходимо сопоставить ассоциацию как пару отношений «один ко многим» и представить ассоциацию как сущность в вашей объектной модели. Например:

User <has-many> AddressAssociation <references> Address

AddressAssociation будет иметь AddressType в качестве свойства. (По сути, я переименовываю UserAddress в AddressAssociation, чтобы сделать его более похожим на сущность домена.) Пользователь в AddressAssociation - один-ко-многим из User-> AddressAssociation. Ссылки - это отношение один к одному между AddressAssociation и Address.

2 голосов
/ 17 ноября 2010

Лучшее решение - использовать две отдельные таблицы.Я не вижу никакой реальной причины, по которой это «не кажется» правильным.

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

...