2010-11-16 57 views
1

我有一個User表和一個Address表。它們通過連接表連接。這種映射是直接的,但我有一些關於連接表的數據,我想在地址表中顯示。NHibernate使用加入表上的數據映射多對多

可能有更好的方法來設置這個,我願意提供建議。

這是表結構。

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表之間的聯接。這樣可以很好地工作,但是然後有兩張具有完全相同結構的表來做同樣的事情,但它看起來並不正確。

回答

3

如果您的連接表(例如UserAddress)不僅僅是一對外鍵並且包含元數據(例如AddressType),您需要將關聯映射爲一對一對多關係並表示關聯作爲對象模型中的一個實體。例如:

User <has-many> AddressAssociation <references> Address 

AddressAssociation將AddressType作爲屬性。 (基本上我將UserAddress重命名爲AddressAssociation,使其聽起來更像一個域實體。)用戶到AddressAssociation是User-> AddressAssociation的一對多。引用是AddressAssociation和Address之間的多對一。

+0

如果沒有辦法直接映射,並有投入地址對象的元數據,那麼也許有2協會桌子是要走的路。唯一的問題是,如果最終增加了更多AddressType,結果會怎樣。我不認爲這會發生在這種情況下,但可能會在另一種情況下發生。 – 2010-11-16 21:36:49

+0

如果不可能添加更多的地址類型,那麼我會使用兩個表格來映射它,就像您原先所做的那樣。您以後可以隨時重構您的模式,並編寫遷移腳本將數據移動到新結構中。在我的最後一個項目中,我經常這樣做,因爲需求發生了變化(或者更好理解),這不是一個大問題。與任何你的里程可能會有所不同。 – 2010-11-17 00:11:29

2

最好的解決方案是使用兩個單獨的表格。我沒有看到真正的理由,爲什麼它不「看起來」是正確的。現在

,如果你真的想使事情變得更加複雜,看看mapping multiple sets in one table in hibernate