2010-02-25 63 views
0

我有一個數據庫有一個人和地址(使用人員ID)之間建模一對一的關係。但是,我找不到使用NHibernate製作地圖的方法。映射表繼承作爲與NHibernate的一對一關係

我的表結構如下:

 
PersonTable 

PersonId 
PersonName 
PersonAge 

AddressTable 

PersonId 
CountryName 
StreetName 
StateName 

,我想有這樣的事情作爲最後一類:

 
PersonClass 

int Id 
string Name 
int Age 
Address HomeAddress 

AddressClass 

string Street 
string Country 
string State 
Person Owner 

我試着用HasOne關係,但我couldn't重用PersonId作爲地址標識符。

謝謝!

編輯:我忘了提及我使用FluentNHibernate,所以流暢的映射和XML都會好的。

回答

0

我做了它使用Id().GeneratedBy.Foreign()在地址類映射引用它的人的ID和它的工作。

謝謝!

0

問題是您的數據庫架構不代表Person和Address之間的「有一個」關係。它代表着「有許多」的關係;您可能會人爲地將其限制爲每個人一個地址,但這並不會改變模型是每個人多個地址的事實。

要獲得「有一個」關係,您需要將AddressID放在PersonTable上。

+0

You're吧!這是一個「被迫」HasOne。我的真實模型與我用作示例的模型不同,但因爲它與我國的稅收相關,所以我認爲我可以用這種簡化來更好地解釋它。無論如何,我仍然需要使用PersonId來獲取它的地址。 – tucaz 2010-02-25 13:10:22

+0

如果您無法更改數據庫模型以匹配您想要的數據模型,那麼您可以將私有屬性放在Person類的地址集合上,然後公開一個返回集合中第一個元素的公共屬性。 – 2010-02-25 13:13:28

+0

我得到了。我的問題是我沒有地址的ID。地址的ID是人員ID。如何使用它? – tucaz 2010-02-25 13:18:24

0

我會將它映射爲Person的一個組件。在人類映射添加以下內容:

Component(x => x.Address, m => 
     { 
      m.Map(x => x.Street, "Street"); 
      m.Map(x => x.State, "State"); 
      // more here 
     }); 

乾杯

+1

謝夫,地址在另一張桌子上。與人不一樣。 – tucaz 2010-02-25 19:14:11

+0

我看到,這是一對一的事實,它沒有被任何其他實體引用,並且它是一個值類型 - 我寧願將它映射爲一個獲得某個perf的組件並丟失額外的連接和模式。非正規化我知道。只是我的2c – Chev 2010-02-26 05:51:02

+0

我同意你的看法。問題是我的數據庫已經存在,我不能改變它以便兩組信息共存於同一個表中,因此我可以使用Component。 – tucaz 2010-02-26 11:07:23

相關問題