NHibernate使用连接表上的数据映射多个到多个

时间:2010-11-16 18:58:16

标签: nhibernate fluent-nhibernate nhibernate-mapping

我有一个User表和一个Address表。它们通过连接表连接。该映射是直截了当的,但我在连接表上有一些数据,我想在地址表上显示。

也可能有更好的方法来设置它,我愿意接受建议。

这是表结构。

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进行映射。

我最初开始使用两个连接表BillingAddressShippingAddress,它们只是UserAddress表之间的连接。这样可以正常工作,但是有两个表具有完全相同的结构,可以做同样的事情,而且它看起来不对。

2 个答案:

答案 0 :(得分:3)

如果您的连接表(例如UserAddress)不仅仅是一对外键并且其中包含元数据(例如AddressType),则需要将关联映射为一对一对多关系并表示关联作为对象模型中的实体。例如:

User <has-many> AddressAssociation <references> Address

AddressAssociation将AddressType作为属性。 (基本上我将UserAddress重命名为AddressAssociation,使其听起来更像是一个域实体。)AddressAssociation的用户是User-&gt; AddressAssociation的一对多。引用是AddressAssociation和Address之间的多对一。

答案 1 :(得分:2)

最佳解决方案是使用两个单独的表。我认为没有理由说它为什么“看起来”不对。

现在,如果你真的,真的想让事情变得更复杂,那么看看mapping multiple sets in one table in hibernate